我有一个目录,其中包含许多扩展名的文件。我想递归删除不以(扩展名在哪里)结尾的*.srt
文件(和*.srt
仅文件)。我提出了以下解决方案,它似乎工作正常,但是,我想知道它是否 100% 正确。-en.srt
srt
find . -name "*.srt" ! -name "*-en.srt" -type f -exec rm -rf {} \;
我有一个目录,其中包含许多扩展名的文件。我想递归删除不以(扩展名在哪里)结尾的*.srt
文件(和*.srt
仅文件)。我提出了以下解决方案,它似乎工作正常,但是,我想知道它是否 100% 正确。-en.srt
srt
find . -name "*.srt" ! -name "*-en.srt" -type f -exec rm -rf {} \;
!——先完整阅读答案,喜欢就用——!
您的命令是正确的,但是不需要
-rf
用作rm
参数。因为您要删除文件而不是目录。另一种清晰的编写方法是(它几乎与您的命令相同):
或@steeldriver 建议您可以使用:
它将要求您允许删除每个创建的文件。
您也可以使用
-delete
而不是rm {} \;
注意它的危险:在做实际工作之前测试会发生什么总是一个好主意,所以我建议运行:
如果它什么都不返回,那么实际的命令将毫无问题地工作,你很高兴......甚至:
检查将要删除的内容。
不要忘记引用
'{}'
:让我们只使用
bash
globbing:启用extglob
and选项,globstar
删除所有以
.srt
排除-en.srt
当前和任何子目录结尾的文件。如果您不确定这样的扩展,请通过前置进行测试
echo
(参见下面的示例)。例子
解释
**/
–globstar
启用该选项后,它匹配任意数量的目录和子目录!(*-en)
–extglob
启用该选项后,它匹配除给定模式之外的任何内容,因此任何不以-en