我有一个目录,其中有许多扩展名的文件。我想递归地删除*.srt文件(和*.srt文件),这些文件不以-en.srt结尾( srt是一个扩展名)。我已经想出了下面的解决方案,它似乎很好,但是,我想知道它是否100%正确。
find . -name "*.srt" ! -name "*-en.srt" -type f -exec rm -rf {} \;发布于 2018-08-11 13:59:12
<#>!
您的命令是正确的,但是不需要使用-rf作为rm参数。因为您正在删除文件而不是目录。
另一种清晰的编写方法是(它与命令几乎相同):
find -name '*.srt' -and -not -name '*-en.srt' -type f -exec rm '{}' \;或者,正如@steeldriver建议的那样,您可以使用:
find -name '*.srt' -and -not -name '*-en.srt' -type f -ok rm '{}' \;它将请求您允许删除每个已创建的文件。
您也可以使用-delete而不是rm {} \;,但是要注意它的危险:
不要忘记,find命令行是作为表达式计算的,因此将-delete放在首位将使find尝试删除您指定的起始点以下的所有内容。在测试以后打算与-delete一起使用的find命令行时,应该显式地指定-depth,以避免以后发生意外。因为-delete意味着-depth,所以不能同时使用-prune和-delete。
在执行实际工作之前测试将要发生的事情总是一个好主意,所以我建议运行:
find -name '*.srt' -and -not -name '*-en.srt' -type f | grep -i en.srt如果它什么也不返回,那么实际的命令就会正常工作,你就可以.甚至:
find -name '*.srt' -and -not -name '*-en.srt' -type f | less去检查要移除的东西。
别忘了引用'{}'的话:
(当从shell调用find时)应该引用它(例如'{}'),以保护它不受shell解释的影响。
发布于 2018-08-12 07:34:10
让我们只使用bash全局操作:在启用extglob和globstar选项之后,
rm **/!(*-en).srt删除以.srt结尾的每个文件,不包括当前目录和任何子目录中以-en.srt结尾的任何文件。如果您不确定是否有这样的扩展,可以先使用echo进行测试(参见下面的示例)。
$ tree
.
├── 01.srt
├── 02.srt
├── no-en.srt
├── not-en.srt
├── subdir
│ ├── 01.srt
│ ├── 02.srt
│ ├── no-en.srt
│ └── not-en.srt
└── unrelated.png
$ shopt -s extglob globstar
$ echo rm **/!(*-en).srt
rm 01.srt 02.srt subdir/01.srt subdir/02.srt
$ rm **/!(*-en).srt
$ tree
.
├── no-en.srt
├── not-en.srt
├── subdir
│ ├── no-en.srt
│ └── not-en.srt
└── unrelated.png**/ -启用globstar选项将匹配任意数量的目录和子目录!(*-en) -启用了extglob选项,这将匹配除给定模式之外的任何内容,因此没有以-en结尾的任何内容都匹配https://askubuntu.com/questions/1064419
复制相似问题