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


11

我想删除目录中的所有文件,而只保留一些指定的文件,它们在名称上没有任何共同之处。我该如何实现?

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

file_1.pnganother_file.jpgsome_music.mp3

Answers:


15

如果您正在使用bash:

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

第一行仅激活扩展模式匹配,然后使用其中之一:

!(pattern-list) 匹配给定模式之一以外的任何东西

而pattern-list是由分隔的一个或多个模式的列表|


或搭配 zsh

setopt extendedglob
rm -- ^(file1|file2)

或者,更便携,使用find

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

3
包括如何返回可选外壳程序行为(shopt -u extglob)可能会很有用。
geedoubleya 2014年

7

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

之后,只需执行以下操作:

mv tmp/* .
rmdir tmp

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

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


将文件移动到tmp目录听起来不错。无论如何,我必须使用命令行执行此操作。谢谢!
AGamePlayer

3
@AwQiruiGuo tmp的优势在于,它首先将文件分成两套,然后将其不可删除地删除。因此,您可以运行ls来查看是否没有丢失要保留的任何文件。
Anthon 2014年

2

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

如果目录名是foo,文件名是bar,请执行以下操作。

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

这将执行以下操作:

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

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


这将不起作用,因为文件名中可以​​包含换行符。
Anthon 2014年

@Anthon更改了find,grep,xargs的选项,以应对包含空格(包括换行符)的文件名
Mathias Weidner 2014年

如果您想使用,find我宁愿这样做find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +
jimmij 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.