我在文件“list_files”中有一个隐藏文件列表,不应在当前目录中删除。如何使用查找命令删除除它们之外的所有内容?我试过了,但它显然不起作用:
find . -iname ".*" \! -iname 'list_files'
您可以通过使用 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 ....
删除文件应始终安全完成。
我假设您有一个包含隐藏文件的目录树以及您想要保留的这些隐藏文件的子集列表。您要删除所有其他隐藏文件。
让我们从隐藏文件列表开始。
find `pwd` -iname ".*" -type f > all-hidden-files.txt
现在,假设您有一些过滤器可以将列表缩减为您想要保留的所有文件(创建您的 list_files)。在这里SomeFilter可能是您手动编辑文件列表以保留您不想删除的文件。
SomeFilter all-hidden-files.txt > list_files
下一个命令将识别 all-hidden-files.txt 中 list_files 中缺少的行,从而为您提供可以删除的文件。
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;
在源目录中创建一个临时目录,将所有内容移动到临时目录,将要保存的文件移回原始位置,然后递归删除临时目录。由于所有移动都在一个文件系统上,因此任何体面的文件系统都应该几乎是瞬时的,这是非常安全的。