Bash脚本删除目录中的文件,但不同文件中列出的文件除外

时间:2014-03-20 18:24:35

标签: bash file delete-file rm

我有两个文件,让我们说

root@test:~ $ cat File1.txt

name1
name2
name3


root@test:~$ cat File2.txt

name4
name5
name6

以及具有多个文件名的目录

root@test:~$ ls

name1
name2
name3
name4
name5
name6
name7
name8
name9

如何删除两个.txt文件上没有的文件?所以最终结果将是

root@test:~$ ls
name1
name2
name3
name4
name5
name6

是否可以用bash写一些东西来做这个???

2 个答案:

答案 0 :(得分:3)

在要删除文件的目录中:

for f in *; do
    [ -z $(grep "^${f}$" <(cat /dir/with/File*.txt)) ] && echo rm -f "$f"
done

将打印出要删除的文件列表。要实际删除它们,请删除echo

答案 1 :(得分:0)

我会用这样的东西测试:

while read -r -d $'\0'; do
    if grep -qs "^$REPLY\$" File1 && grep -qs "^$REPLY\$" File2; then
        # Filename found in both File1 and File2: do nothing
        :
    else
        rm -i "$REPLY"
    fi
done < <(find . -maxdepth 1 -type f -print0)

除非我遗漏了某些内容,否则应该正确处理带有嵌入空格,换行符和反斜杠的文件名。

一旦您确信它正在执行您想要的操作,就可以从-i中删除交互式标记(rm)。