Alice Benyard
Alice Benyard

Reputation: 13

Searching a directory for files

Hi all I am trying to write a script which recursively searches directories from a parent directory and counts how many text files (.txt) are in the sub directories. I also need to output the files relative path to the parent directory.

Lets say I have a folder named Files

Within this folder there may be:

Files/childFolder1/child1.txt
Files/childFolder1/child2.txt
Files/childFolder1/child3.txt
Files/childFolder2/child4.txt
Files/childFolder2/child5.txt
Files/child6.txt

So the output would be

The files are:

/childFolder1/child1.txt
/childFolder1/child2.txt
/childFolder1/child3.txt
/childFolder2/child4.txt
/childFolder2/child5.txt
/child6.txt

There are 6 files in the 'Files' folder

So far I have a script which is this:

#! /bin/csh

find $argv[1] -iname '*.txt'

set wc=`find $argv[1] -iname '*.txt' | wc -l`

echo "Number of files under" $argv[1] "is" $wc

I have no idea how to make the output so it only shows the file path relative to the directory. Currently my output is something like this:

/home/Alice/Documents/Files/childFolder1/child1.txt
/home/Alice/Documents/Files/childFolder1/child2.txt
/home/Alice/Documents/Files/childFolder1/child3.txt
/home/Alice/Documents/Files/childFolder2/child4.txt
/home/Alice/Documents/Files/childFolder2/child5.txt
/home/Alice/Documents/Files/child6.txt
Number of files under /home/Alice/Documents/Files is 6

Which is not desired. I am also worried about how I am setting the $wc variable. If the directory listing is large then this is going to acquire a massive overhead.

Upvotes: 1

Views: 129

Answers (3)

deviantkarot
deviantkarot

Reputation: 146

Also, if you don't want to execute find twice, you can either:

  • store its output in a variable, though I don't know if variables are limited in size in csh ;
  • store its output in a temporary file, but purists don't like temporary file;
  • count the number of lines yourself in a while loop which iterates over the results of find.

Note that if you used bash instead, which supports process substitution you could duplicate find's output and pipe it to multiple commands with tee:

find [...] | tee >(cmd1) >(cmd2) >/dev/null

Upvotes: 0

Hayden
Hayden

Reputation: 2808

Try

find $argv[1] -iname '*.txt' -printf "%P \n"

This should give the desired output :)

Hayden

Upvotes: 0

Alex
Alex

Reputation: 11090

cd $argv[1] first and then use find . -iname '*.txt' to make the results relative to the directory

Upvotes: 1

Related Questions