【问题标题】:Bash Script delete files in directory except those listed in different filesBash 脚本删除目录中的文件,但不同文件中列出的文件除外
【发布时间】:2014-04-27 19:50:10
【问题描述】:

我有两个文件,比如说

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 中编写一些东西来做到这一点???

【问题讨论】:

  • 你的意思是删除both文件中没有列出的所有文件吗?如果是这样,第一步应该比较两个文件以获取两个文本文件的交集。 IE。 “保留这些文件”列表。如果您的意思是在任一文件中 - 这与拥有一个包含两种内容的文件相同。
  • 是的,我想这两种方式都非常相似,我想我可以将两个 txt 文件合并到一个列表中,然后用它来删除文件..
  • @MarcosPousada:你的问题是要删除不在both中的文件,你的意思是要问如何删除不在中的文件?

标签: bash file delete-file rm


【解决方案1】:

在要删除文件的目录中:

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

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

【讨论】:

  • 如果文件名中带有空格或文件名是另一个文件名的子字符串,该怎么办?
  • 带空格的文件名很好,您对子字符串注释是正确的 - 修改后的答案。
【解决方案2】:

我会用这样的东西进行测试:

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 中删除它。

【讨论】:

    猜你喜欢
    • 2015-11-27
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2013-05-18
    • 2014-07-08
    • 2015-07-25
    相关资源
    最近更新 更多