在不破坏目录结构的情况下,从目录子树的所有级别按扩展名删除文件

时间:2014-06-12 03:01:06

标签: linux shell glob

使用shell脚本,我想从以下目录结构中删除文本文件,日志文件和CSV文件,同时保持目录结构不变:

|
|------bar/
    |
    |---file1.txt
    |---file2.txt
    |
    |---subdir1/
    |   |---file1.log
    |   |---file2.log
    |
    |---subdir2/
        |---image1.log
        |---image2.log

我正在使用rm -rf /bar/*,因此我得到以下结果:

|------bar/

但是,我想要以下结果:

|
|------bar/
    |
    |
    |
    |
    |---subdir1/
    |   
    |   
    |
    |---subdir2/

3 个答案:

答案 0 :(得分:5)

在UNIX上(或在使用cygwin的Windows上):

旧学校:

find bar -type f -name "*.txt" -o -name "*.log" -o -name "*.csv" -print0 |
xargs -0 rm -f

使用GNU find(由mklement0建议):

find bar -type f -name "*.txt" -o -name "*.log" -o -name "*.csv" -delete

答案 1 :(得分:0)

此命令将查找并删除条目目录中的所有.log,.txt和.csv文件:

find ./bar/ -type f -name "*.txt" -o -name "*.log" -o -name "*.csv" | xargs rm

如果您的文件包含空格,则需要在Employed Russian的解决方案上使用稍有不同:

find ./bar/ -type f -name "*.txt" -o -name "*.log" -o -name "*.csv" -print0| xargs -0 rm

答案 2 :(得分:0)

如果您正在运行bash 4+

(shopt -s globstar nullglob; cd bar && rm **/*.txt **/*.log **/*.csv)
  • shell选项globstar启用了对目录层次级别与**匹配文件的支持。
  • shell选项nullglob使得与NO文件匹配的globs返回空字符串,而不是通过未修改的通过globs,这通常会导致错误。)
  • 整个命令在子shell中运行(由于(...)中的封闭,以便本地化更改shell选项的效果。