如何以递归方式删除两个目录中的不同文件

时间:2015-08-14 06:37:35

标签: linux bash shell

我有2个不同的递归目录,在一个目录中有200个 .txt 文件在另一个目录中有210个 .txt 文件,需要一个脚本来查找不同的文件名和将它们从目录中删除。

2 个答案:

答案 0 :(得分:3)

可能有更好的方法,但我想:

find directory1 directory2 -name \*.txt -printf '%f\n' |
  sort | uniq -u |
  xargs -I{} find directory1 directory2 -name {} -delete

find directory1 directory2 -name \*.txt -printf '%f\n':   打印与glob *.txt

匹配的每个文件的basename

sort | uniq -u:   只打印唯一的行(如果你想删除重复的,那就是uniq -d

xargs -I{} find directory1 directory2 -name {} -delete:   删除它们(重新指定缩小搜索范围的路径,避免删除初始搜索路径之外的文件)

备注

感谢@KlausPrinoth提出的所有建议。

显然,我假设使用GNU用户空间,我认为运行提供最低POSIX兼容性的工具的人将能够适应它。

答案 1 :(得分:1)

另一种方法是使用diff,它能够更好地查找目录中文件的文件差异。例如,如果d1d2分别包含200和210个文件(前200个文件相同),则可以使用diffprocess substitution来提供要移除到while循环的名称:

( while read -r line; do printf "rm %s\n" ${line##*: }; done < <(diff -q d1 d2) )

输出(d1包含10个文件,d2包含12个文件)

rm file11.txt
rm file12.txt

diff不适合所有情况,但找到目录差异并且非常灵活。