删除目录中名称与文件列表中的一行不匹配的所有文件

Nat*_*han 9 find files

我有一个包含 1000 多个文件的目录。在一个文本文件中,我有大约 50 个文件名,每行一个。我想删除目录中所有文件名与列表中的条目不对应的文件。做到这一点的最佳方法是什么?我启动了一个 shell 脚本,但无法确定正确的命令来确定文件名是否在列表中。谢谢。

Emm*_*uel 8

我意识到任何询问如何删除文件的问题都必须非常小心。我的第一个答案太仓促了,我没有考虑到文件列表可能格式不正确而无法与 egrep 一起使用的事实。我编辑了答案以降低风险。

这应该适用于名称中没有空格的文件:

首先重建您的文件列表以确保匹配确切的文件名:

sed -e 's,^,^,' -e 's,$,$,'  filelist  > newfilelist 
Run Code Online (Sandbox Code Playgroud)

构建 rm 命令

cd your_directory
ls | egrep -vf newfilelist   | xargs -n 1 echo rm  >  rmscript
Run Code Online (Sandbox Code Playgroud)

检查 rm 脚本是否适合您(您可以使用“vim”或“less”来完成)。
然后执行操作:

sh -x rmscript
Run Code Online (Sandbox Code Playgroud)

如果文件名中有空格(如果文件名中有空格,"那么这将不起作用):

ls | egrep -vf newfilelist  | sed 's,^\(.*\)$,rm "\1",' > rmscript
Run Code Online (Sandbox Code Playgroud)

当然文件列表不应该在同一个目录中!

编辑:

Nathan 的文件列表包含与目录中所有文件匹配的名称(如“html”匹配“bob.html”)。所以没有被删除,因为egrep -vf吸收了所有的流。我添加了一个命令,在每个文件名周围放置一个“^”和一个“$”。我很幸运,Nathan 的文件列表是正确的。如果使用 CR-LF 结束行或附加空格进行 DOS 格式化,则 egrep 不会保留任何文件并全部删除。