从目录子树的各个级别删除文件,而不破坏目录结构

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

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

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

 |------bar/ 

不过,我想要以下结果:

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

在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 

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

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

如果您的文件包含空格,您将需要使用俄罗斯就业解决方案略有差异:

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

如果你正在运行bash 4+

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