如何从列表中删除匹配的文件名

如何从列表中删除匹配的文件名

我想扫描文件名来源目录及其所有子目录然后将输出打印到文件中,例如:

ls -hR >> del.txt

(然而,我不知道如何不是列出文件夹)

我不需要将文件列表保存到文件中,但我认为这会使事情变得安全和清晰。

然后,我想要一个“命令”来搜索某个目的地目录及其子目录并删除del.txt排除文件夹中所有匹配的文件。

这些文件的名称和扩展名差别很大,因此使用正则表达式无法解决问题,因为我只想删除这些文件。此外,我应该删除文件的目录中还有其他需要保留的文件,这些文件的扩展名与源目录中的文件相同。

答案1

您可以从源目录构建文件名列表,并将它们del.txt作为空分隔条目保存到文件中,如下所示:

find . -type f -printf "%f\0" > del.txt

然后进行空运行测试,/full/path/to/destination/用目标目录的实际完整路径替换,如下所示:

cat del.txt | xargs -0 -I {} find /full/path/to/destination/ -type f -name "{}"

如果您对输出满意,请使用以下命令删除文件:

cat del.txt | xargs -0 -I {} find /full/path/to/destination/ -type f -name "{}" -delete

或者,您可以将两个命令放入管道中以构建文件名列表,搜索它们并动态打印试运行,如下所示:

find . -type f -printf "%f\0" | xargs -0 -I {} find /full/path/to/destination/ -type f -name "{}"

然后像这样删除:

find . -type f -printf "%f\0" | xargs -0 -I {} find /full/path/to/destination/ -type f -name "{}" -delete

注意:以空分隔的文件名列表可能不易于人类阅读,但对于包含新行的文件名来说,这是一种更安全的方式。例如...您可以构建一个对人类友好的列表用于审查目的即供您阅读并保存...与上述命令一起使用),如下所示:

find . -type f -printf "%f\n" > my_list.txt

相关内容