find output seems to change when piped


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting find output seems to change when piped
# 1  
Old 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.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

Running java script from piped output

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

2. Shell Programming and Scripting

Print line number from piped output

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

3. Shell Programming and Scripting

Can't Output Piped Perl In-line command to a File

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

4. Shell Programming and Scripting

Output piped to case insensitive awk

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

5. Shell Programming and Scripting

Cat piped output

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

6. Shell Programming and Scripting

script output should be piped to a file

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

7. Shell Programming and Scripting

Piped output from SSH tunnel hangs?

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

8. Shell Programming and Scripting

Directing only part of a script's output to piped application

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

9. Shell Programming and Scripting

Concatenate piped output and some var?

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

10. Shell Programming and Scripting

Exclude Certain Entries from Piped or Redirected Output?

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
Login or Register to Ask a Question