如何删除文件名中没有给定字符串的某些扩展名的文件?

men*_*ith 7 command-line rm

我有一个目录,其中包含许多扩展名的文件。我想递归删除*.srt(和文件*.srt仅文件),它最终不会-en.srt(其中srt扩展名))。我想出了以下解决方案,它似乎工作正常,但是,我想知道它是否 100% 正确。

find . -name "*.srt" ! -name "*-en.srt" -type f -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)

Rav*_*ina 9

!- 首先完整阅读答案,然后如果您喜欢它,请使用它-!

您的命令是正确的,但是不需要-rf用作rm参数。因为您正在删除文件而不是目录。

编写它的另一种清晰方法是(它几乎与您的命令相同):

find -name '*.srt' -and -not -name '*-en.srt' -type f -exec rm '{}' \;
Run Code Online (Sandbox Code Playgroud)

或如@steeldriver 建议您可以使用:

find -name '*.srt' -and -not -name '*-en.srt' -type f -ok rm '{}' \;
Run Code Online (Sandbox Code Playgroud)

它将要求您允许删除每个已建立的文件。

您也可以使用-delete而不是rm {} \;意识到它的危险:

不要忘记 find 命令行被评估为 expres? sion,因此将 -delete 放在首位将使 find 尝试删除您指定的起点以下的所有内容。在测试您以后打算与 -delete 一起使用的 find 命令行时,您应该明确指定 -depth 以避免以后出现意外。因为 -delete 暗示 -depth,所以不能有效地将 -prune 和 -delete 一起使用。


在做实际工作之前测试会发生什么总是一个好主意,所以我建议运行:

find -name '*.srt' -and -not -name '*-en.srt' -type f | grep -i en.srt
Run Code Online (Sandbox Code Playgroud)

如果它什么都不返回,那么实际的命令将毫无问题地工作,你很高兴......甚至:

find -name '*.srt' -and -not -name '*-en.srt' -type f | less
Run Code Online (Sandbox Code Playgroud)

检查将要删除的内容。

并且不要忘记引用'{}'

(当从 shell 调用 find 时)它应该被引用(例如,'{}')以保护它不被 shell 解释。