06-12-2010
find output seems to change when piped
Currently, i am trying to create a simple robust script that is intended to move the contents of a given source directory to a target directory. Optionally, the script should allow to either move the whole source dir content, or dotfiles only, or visible files only. I am aware the target directory should not be located within the source dir's tree.
Step I is to obtain all the relevant filenames to be found (directly) below the source dir:
1) any files:
find /source/path -maxdepth 1 -mindepth 1 -print0 -iname '*'
2) visible files only:
find /source/path -maxdepth 1 -mindepth 1 -print0 -iname '[!.]*'
3) dotfiles only:
find /source/path -maxdepth 1 -mindepth 1 -print0 -iname '[.]*'
-note the usage of -print0 to assure resulting filenames will be separated by Null char
-output directly to the shell is as expected, 1), 2) and 3) return a string containing all, visible, hidden files' names respectively.
Step II is to pipe the results to "xargs" invoking "mv" to perform the actual source content relocation
1) resulting command using I-1:
find /source/path/ -maxdepth 1 -mindepth 1 -print0 -iname '*' | xargs --null --no-run-if-empty mv --target-directory=/target/path
2), 3):
-iname option within "find" changed according to I-2, I-3
The odd thing is, II-1, II-2, II-3 all yield the same result which is that any contents of the source dir are moved to the target dir. So I am left with the question where this goes wrong:
a) does the "find" output look different when piped through vs. written to the shell?
b) is the globbing used within find correct after all?
c) is the "mv" invocation within "xargs" done correctly?
Any enlightenment would be greatly appreciated!
---------- Post updated at 03:57 PM ---------- Previous update was at 03:37 PM ----------
After some playing around, it actually appears to be a problem within find:
any time the -print0 option is used as within Step I, the find output contains all directory contents.
After putting this option behind the "-iname ...", it seems to work correctly, like this:
find /source/path -maxdepth 1 -mindepth 1 -iname '[!.]*' -print0
Should have tried this first, but did not stumble upon a hint towards "options order" within the find man pages.
10 More Discussions You Might Find Interesting
1. Shell Programming and Scripting
I want to execute a command something like:
find / -name "jni.h"
and I want to direct the output of that command to some type of
filter that will leave out all the lines reporting inaccessible
directories (permission unavailable). Is this a pipe or a redirect?
For example, output like... (1 Reply)
Discussion started by: downplay
1 Replies
2. Shell Programming and Scripting
Hello,
There is pipe chain and I want concacenate piped data with some variable:
balh blah| ... $var1
What command I should use instead ... to concatenate piped output with $var1. I think I coud solve this using temp var - but could it be done in one line like sample above ?
thanks... (4 Replies)
Discussion started by: vilius
4 Replies
3. Shell Programming and Scripting
Is there a way to keep the output of a script displayed on the terminal when it's run by itself, but suspend part of that output and only have a specific part delivered when it's piped to another script or program? I'm thinking something like the following pseudocode:
#!/bin/bash
... (1 Reply)
Discussion started by: trigg
1 Replies
4. Shell Programming and Scripting
Hi All,
When starting an SSH tunnel, piped output 'hangs' (on AIX) :
ssh -Nf -Llocalhost:22000:server:22 proxy | cat -vet -
... hangs ...
Does anybody know how to prevent this?
Of course, in my script I don't use the tunnel as I do in the example above. In my script the call to ssh is... (7 Replies)
Discussion started by: whbos
7 Replies
5. Shell Programming and Scripting
hi
i have a script named mount.sh under the location /data/scripts/ in my aix box
i want this script this to be run everyday morning at 04:45 AM and the output of the script should be piped to a file
how to do this ? (3 Replies)
Discussion started by: samsungsamsung
3 Replies
6. Shell Programming and Scripting
Hello,
How can I efficiently cat piped output with another file?
> (awk command) | cat file1 (piped output)
Thanks! (11 Replies)
Discussion started by: palex
11 Replies
7. Shell Programming and Scripting
I have an encrypted password file, and I've created a simple script to search the password file for a particular record. There are multiple lines per record, so I'm using a record delimiter.
#!/bin/bash
PATTERN=$1
openssl des3 -d -salt -in ~/docs/pass.des3 | awk '{ FS="\n" ; RS="*" }... (2 Replies)
Discussion started by: 0rac1e
2 Replies
8. Shell Programming and Scripting
Hello,
I'm pretty stumped, and I don't know why I am not able to redirect the output to the 'graphme' file with the command below in Fedora 18.
tcpdump -l -n -t "tcp == 18" | perl -ane '($s,$j)=split(/,/,$F,2); print "$s\n";' > graphme
In case you're wondering, I was following the example... (2 Replies)
Discussion started by: ConcealedKnight
2 Replies
9. Shell Programming and Scripting
i need to do something like this:
script.sh
#!/bin/sh
echo "hello"
echo "My First name is John"
echo "My Last name is Smith"
echo "I am here to save you a lot of work"
sed -n 4,5p $0
i dont want to run the script. i just want to pull out specific line from it. so the logic here... (5 Replies)
Discussion started by: SkySmart
5 Replies
10. Programming
to run most other scripts through a pipe, something similar to the following is usually enough:
cat script.sh | sh
cat perl.pl | perl -- "<arguments"
However, for javascript command line scripts, i cant seem to get this to work. Any ideas?
cat hull.js
#!/usr/bin/js
... (3 Replies)
Discussion started by: SkySmart
3 Replies
LEARN ABOUT HPUX
dbs-edit-patch
DBS-EDIT-PATCH(1) Debian Build System DBS-EDIT-PATCH(1)
NAME
dbs-edit-patch - Edit a DBS patch
SYNOPSIS
dbs-edit-patch [options] patch
dbs-edit-patch -h|--help
DESCRIPTION
dbs-edit-patch is script to generate or modify patches for Debian source-packages in DBS format.
WARNING
dbs is deprecated, please switch to the `3.0 (quilt)' Debian source package format instead. See http://wiki.debian.org/Projects/Deb-
Src3.0#FAQ for a short guide how to do it.
OPTIONS
-h, --help
Show summary of options.
-t dir, --tmpdir=dir
Directory for the temporary files, default is /tmp or if set $TMP.
-s dir, --sourcedir=dir
Top level directory of the debian-package source-tree, default is the present working directory.
-P dir, --sourcepatchdir=dir
Directory containing upstream patches.
-T dir, --sourcetardir=dir
Directory containing the upstream tarball.
-p level, --strip=level
Striplevel -p of patch (Option -p of diff(1)), accepted values are 0 and 1, default is 0.
ENVIRONMENT VARIABLES
TMP Sets the directory for the temporary files, can be overridden with -t dir.
debian/vars
dbs-edit-patch will automatically use variables defined in the optional debian/vars file.
When a file debian/vars.in exists and debian/vars either does not exist or is older than any of the following files: debian/vars.in,
debian/changelog, debian/rules or debian/control, then dbs-edit-patch will try updating the vars file by running the following command
make -f debian/rules -W debian/vars.in debian/vars
EXAMPLES
Edit the 021_debian patch of Heimdal:
~/heimdal-0.3d> dbs-edit-patch -t/tmp 021_debian
Extracting source heimdal-0.3d.tar.gz ... successful.
Applying patch 001_replay ... successful.
etc.
Copying heimdal-0.3d to heimdal-0.3d-old ... successful.
Applying patch 021_debian ... successful.
Edit files under /tmp/021_debian/heimdal-0.3d as required, then put a short description into /tmp/021_debian/patch-description if desired,
and finally execute /tmp/021_debian/dbs-update-patch to save the results.
Technical note: dbs-edit-patch extracts all patches before 021_debian into /tmp/021_debian/heimdal-0.3d, copies the result to
/tmp/021_debian/heimdal-0.3d-old, and applies the last patch 021_debian (if it exists). Also, it creates a shell script which will create
the diff between the old and new directories:
~/heimdal-0.3d> ls -la /tmp/021_debian
total 12
-rwxr-xr-x 1 bam users 112 Jan 31 13:31 dbs-update-patch*
-rw-r--r-- 1 bam users 0 Jan 31 13:31 patch-description
drwxr-xr-x 14 bam users 4096 Jan 31 13:31 heimdal-0.3d/
drwxr-xr-x 14 bam users 4096 Jan 31 13:31 heimdal-0.3d-old/
drwxr-xr-x 5 bam users 4096 Jan 31 13:31 .stampdir/
~/heimdal-0.3d> cat /tmp/021_debian/dbs-update-patch
#!/bin/sh -e
cd "/tmp/021_debian"
HOOK_DIR="/usr/src/heimdal/debian/dbs-hooks"
test -d "$HOOK_DIR" && run-parts "$HOOK_DIR" --arg update-patch-prediff
find -name "*.bak" -print0 | xargs -0 --no-run-if-empty rm
find -name "*~" -print0 | xargs -0 --no-run-if-empty rm
: > new_patch
test ! -e patch-description || cp patch-description new_patch
diff -ruN heimdal-0.3d-old heimdal-0.3d >> new_patch || test $? -eq 1
mv new_patch /usr/src/heimdal/debian/patches/021_debian
test -d "$HOOK_DIR" && run-parts "$HOOK_DIR" --arg update-patch-postdiff
SEE ALSO
diff(1), dbs(7), /usr/share/doc/dbs/
AUTHOR
DBS was written by Adam Heath, modified by Ben Collins, modified and packaged for Debian by Brian May. This manpage was generated by
Andreas Metzler and modified by Robert Luberda.
Debian February 15th, 2011 DBS-EDIT-PATCH(1)