开发者

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/cases 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): exclude watch.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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜