Looping through directories in Bash
I require the script to cd
to a directory, then delete all but a few files in sub-directories—but leave the folders alone. Would it help to use switch
/case
s for each file I need to preserve?
Ideally, I think it should keep searching for further sub-dirs, instead of me having nested loops which only search down two levels.
Another problem is that it skips folders with spaces (though this isn’t an issue with the volumes th开发者_StackOverflow社区at the script will run, for now).
Here’s my code:
for i in /Users/YourName/Desktop/Test/* ; do
if [ -d "$i" ]; then
cd $i
for j in "$i"/* ; do
if [ -d "$j" ]; then
cd $j
for k in $(ls *); do
if [ ! $k == "watch.log" ]; then
echo $k
rm -rf $k
fi
done
fi
done
fi
done
You should use find
:
for i in $(find . -type d)
do
do_stuff "$i"
done
If you really have a lot of directories, you can pipe the output of find into a while read
loop, but it makes coding harder as the loop is in another process.
About spaces, be sure to quote the variable containing the directory name. That should allow you to handle directories with spaces in their names fine.
How about this?
$ find /Users/YourName/Desktop/Test -type f -maxdepth 2 -not -name watch.log -delete
Explanation
-type
: look for files only-maxdepth
: go down two levels at most-not -name
(combo): excludewatch.log
from the search-delete
: deletes files
Recommendation
Try out the above command without the -delete
flag first. That will print out a list of files that would have been deleted.
Once you’re happy with the list, add -delete
back to the command.
Using find? You can use several parameters, including depth, file age (as in stat), perms etc...
find . -maxdepth 2
精彩评论