如何删除文件夹中除某些指定文件之外的所有文件?

如何删除文件夹中除某些指定文件之外的所有文件?

我想删除目录中的所有文件,同时只保留一些指定的文件,它们在名称上没有任何共同点。我怎样才能做到这一点?

例如,我要保留的文件名是:

file_1.png, another_file.jpg,some_music.mp3

答案1

如果您使用的是 bash:

shopt -s extglob
rm -- !(file1|file2|file3)

第一行只是激活扩展模式匹配,之后我们使用其中一个:

!(pattern-list)匹配除给定模式之一之外的任何内容

模式列表是由 . 分隔的一个或多个模式的列表|


或者与zsh

setopt extendedglob
rm -- ^(file1|file2)

或者,更便携,使用find

find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -v {} +

答案2

创建一个子目录tmp,将所有要保留的文件移至该目录,rm -f *然后执行操作。这不会影响tmp目录。

之后只需执行以下操作:

mv tmp/* .
rmdir tmp

(假设您移动的文件都不以点开头)。

这是使用鼠标和像 Nautilus 这样的文件浏览器有意义的少数情况之一,您实际上可以Ctrl单击要保留的几个文件,然后使用菜单:Edit -> Invert Selection获取其他文件,然后删除这些文件。

答案3

将要保留的文件的名称添加到文本文件中,每行一个。该文件不应位于目录中,或者您也应该添加其名称。

如果您的目录名称是文件的名称是酒吧, 请执行下列操作。

find foo -type f -print0|grep -vzZ -f bar|xargs -0 rm

这会执行以下操作:

  1. find -type f搜索所有文件的名称及其子目录并将它们打印到 STDOUT。使用选项,-print0它用 NUL 字节分隔文件名。
  2. grep -v -f bar排除与以下行匹配的所有文件名酒吧。使用选项时-z,它将其输入视为一组由 NUL 字节分隔的行,使用选项时,-Z它将使用 NUL 字节分隔其输出。
  3. xargs rm反复调用rm删除文件。使用选项,-0它将其输入视为一组由 NUL 字节分隔的行。

这适用于包含空格的文件名。

相关内容