从终端删除具有特定扩展名的文件,但一个文件除外

273

我需要删除所有扩展名为.gif的文件,但其中一个文件名为“ filename.gif”的文件除外。在终端中执行此操作的最佳方法是什么?

rm命令*.gif删除所有gif文件,包括该文件filename.gif

埃利亚·卡根(Eliah Kagan)

这是您可能应该使用的简单解决方案:

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目录中的文件.)!

有关详细信息,请参阅手册页bashsh以及用于在这些例子中使用的命令:mvrm[,和(特别是)find

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

删除所有扩展名为“ .sh”的文件,但通过终端保留一个与扩展名匹配的文件

gitignore,以一个扩展名跟踪所有文件,但一个特定文件除外

如何将具有特定扩展名的相同文件复制到终端中的另一个目录

删除具有特定扩展名的文件的脚本问题

Gradle-删除具有特定扩展名的文件

通过regexp删除具有特定扩展名的文件

删除具有特定扩展名的诊断文件的脚本

从具有特定扩展名的文件中删除行

将具有特定扩展名的所有文件复制到另一个目录,同时更改扩展名

删除特定扩展名的文件(Linux中的文件除外)

使用Shell脚本来检查是否存在一个或多个具有特定扩展名的文件?

删除php / html扩展名,并从规则中排除一个特定文件

加载一个只有扩展名的文件

如何删除特定文件夹中具有特定扩展名的所有文件?

一次删除所有具有特定名称但具有不同扩展名的文件

如何将具有特定扩展名的任何文件从一个位置批量移动到另一个位置?

如何在Linux中将具有特定扩展名的文件从一个目录复制到另一个目录

Git-如何递归地忽略一个目录中的所有文件,但某些文件具有特定的扩展名

使用线程删除具有特定扩展名的文件,忽略特定日期的文件

将 2 个具有不同扩展名的相似文件重命名为第一个文件,但保留扩展名

如何删除文件夹中所有具有特定扩展名的文件?

Powershell删除具有特定文件扩展名的所有文件

Windows脚本将具有特定扩展名的30天以上的文件移动到另一个文件夹

如何从Andorid中的文件夹中删除具有特定扩展名的文件

当所有文件具有不同的扩展名时,如何将文件夹中所有文件的扩展名更改为一个公共扩展名?

删除所有子文件夹和文件,但父文件夹中的特定扩展名除外

.tar.gz文件具有两个扩展名而不是一个扩展名的原因是什么?

如何在Windows 8中删除具有特定扩展名的所有文件?

获取具有特定扩展名的所有文件