sachinpkale
sachinpkale

Reputation: 999

Linux: Redirecting output of a command to "find"

I have a list of file names as output of certain command. I need to find each of these files in a given directory.

I tried following command:

ls -R /home/ABC/testDir/ | grep "\.java" | xargs find /home/ABC/someAnotherDir -iname

But it is giving me following error:

find: paths must precede expression: XYZ.java

What would be the right way to do it?

Upvotes: 0

Views: 257

Answers (2)

William Pursell
William Pursell

Reputation: 212248

ls -R /home/ABC/testDir/ | grep -F .java | 
    while read f; do find . -iname "$(basename $f)"; done

You can also use ${f##*/} instead of basename. Or;

find /home/ABC/testDir -iname '*.java*' | 
 while read f; do find . -iname "${f##*/}"; done

Note that, undoubtedly, many people will object to parsing the output of ls or find without using a null byte as filename separater, claiming that whitespace in filenames will cause problems. Those people usually ignore newlines in filenames, and their objections can be safely ignored. (As long as you don't allow whitespace in your filenames, that is!)

A better option is:

find /home/ABC/testDir -iname '*.java' -exec find . -iname {}

The reason xargs doesn't work is that is that you cannot pass 2 arguments to -iname within find.

Upvotes: 3

rdbmsa
rdbmsa

Reputation: 306

find /home/ABC/testDir -name "\.java"

Upvotes: 0

Related Questions