我有一个目录,其中包含许多扩展名的文件。我想递归删除*.srt(和文件*.srt仅文件),它最终不会有-en.srt(其中srt扩展名))。我想出了以下解决方案,它似乎工作正常,但是,我想知道它是否 100% 正确。
find . -name "*.srt" ! -name "*-en.srt" -type f -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)
!- 首先完整阅读答案,然后如果您喜欢它,请使用它-!
您的命令是正确的,但是不需要-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 解释。
| 归档时间: |
|
| 查看次数: |
2191 次 |
| 最近记录: |