我需要删除所有扩展名为.gif的文件,但其中一个文件名为“ filename.gif”的文件除外。在终端中执行此操作的最佳方法是什么?
rm命令*.gif
删除所有gif文件,包括该文件filename.gif
。
这是您可能应该使用的简单解决方案:
mv filename.gif filename.gif.keep
rm *.gif
mv filename.gif.keep filename.gif
.keep
扩展名没有什么特别的,它只是使扩展名暂时不以结尾.gif
。
如果您一定不能重命名文件(并且在脚本情况下这很重要):
for X in *.gif; do
if [ "$X" != "filename.gif" ]; then
rm "$X"
fi
done
或者,您可以像这样简短地编写它:
for X in *.gif; do [ "$X" != "filename.gif" ] && rm "$X"; done
您可能更喜欢使用find
;它的功能非常强大,你可能会认为这是更具可读性,它更好把手与像怪异字符的文件名*
在其中。
find . -maxdepth 1 -not -name 'filename.gif' -name '*.gif' -delete
我已经使用-not
运算符来提高可读性,但是如果POSIX合规性很重要-如果您不使用GNU find,或者如果该脚本用于您打算重新分发给其他人或在各种系统上运行的脚本,则应该使用!
运算符:
find . -maxdepth 1 ! -name 'filename.gif' -name '*.gif' -delete
一件方便的事find
是,您可以轻松地修改命令以区分大小写,以便它也可以查找和删除带有扩展名的文件,例如.GIF
:
find . -maxdepth 1 -not -name 'filename.gif' -iname '*.gif' -delete
请注意,我已经用-iname
代替-name
了搜索模式,*.gif
但没有将它用于filename.gif
。大概您知道文件的确切名称,并且-iname
不仅在扩展名中,而且在文件名中的任何地方都将匹配备用大小写。
所有这些解决方案仅删除当前目录中立即存在的文件。它们不会删除当前目录中未包含的文件,也不会删除当前目录的子目录中的文件。
如果要删除当前目录中所有位置的文件(即,包括在子目录中以及这些子目录的子目录中,等等,即当前目录或其任何后代中包含的文件),请使用find
不带 maxdepth -1
:
find . -not -name 'filename.gif' -name '*.gif' -delete
注意这一点!
您也可以使用设置其他值-maxdepth
。例如,要删除当前目录及其子孙目录中的文件,但不能更深:
find . -maxdepth 3 -not -name 'filename.gif' -name '*.gif' -delete
只要确保您从未把-delete
其他表达式放在首位即可!您会看到我总是放在-delete
最后。如果您将其放在开头,则将首先对其进行评估,然后将删除其下的所有文件.
(包括未结尾的.gif
文件和的深层sub-sub ... subdirect目录中的文件.
)!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句