如何使用Find-command删除列出的文件以外的所有内容?

时间:2009-05-21 21:39:39

标签: list shell find

我有一个文件“list_files”中的隐藏文件列表,不应该在当前目录中删除。如何使用Find-command删除除它们之外的所有内容?我试过了,但显然不起作用:

find . -iname ".*" \! -iname 'list_files'

3 个答案:

答案 0 :(得分:1)

您可以通过使用bash脚本调用exec来执行此操作,如下所示: -

find . -iname ".*" -exec bash -c "fgrep {} /tmp/list_files >/dev/null || rm -i {}" \;

要非常小心如何构建文件列表。要排除的文件列表必须与find生成的输出相同,否则您将删除与您的模式匹配的所有文件。

我已将交互选项放到rm上,您可能希望将其用于测试。如果您希望使用此技术删除目录,则需要修改rm选项。

您可能希望使用用于运行查找的相同文件夹中的find来构建文件列表,以确保排除将被尊重,尽管绝对而非相对路径将是更好,更安全的选项,因此您的找到会变成

find /some/folder/name -name "some pattern" -exec ....

答案 1 :(得分:1)

应始终安全地删除文件。

我假设您有一个包含隐藏文件的目录树以及您要保留的这些隐藏文件的子集列表。您想要删除所有其他隐藏文件。

让我们从隐藏文件列表开始。

find `pwd` -iname ".*" -type f > all-hidden-files.txt

现在,假设您有一些过滤器,它会将列表缩减为您要保留的所有文件(创建list_files)。这里 SomeFilter 可能是您手动编辑文件列表以保留您不想删除的文件列表。

SomeFilter all-hidden-files.txt > list_files

下一个命令将识别list_files中缺少的all-hidden-files.txt中的行,这些行为您提供了可以删除的文件。

comm -3 all-hidden-files.txt list_files > removable-files.txt

编辑:刚认识到应该对comm的输入文件进行排序。所以使用它作为,

comm -3 <(sort all-hidden-files.txt | uniq) <(sort list_files | uniq) \
    > removable-files.txt

您可以确认这适用于您,然后删除使用

之类的内容生成的文件列表
for i in $(<removable-files.txt); do rm $i; done;

答案 2 :(得分:1)

在源目录中创建一个临时目录,将所有内容移动到临时目录,将要保存的文件移回原始位置,然后递归删除临时目录。由于移动都在一个文件系统上,因此对于任何体面的文件系统来说都应该是即时的,这是非常安全的。