![如何删除文件夹中除某些指定文件之外的所有文件?](https://linux22.com/image/59071/%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD%E9%99%A4%E6%9F%90%E4%BA%9B%E6%8C%87%E5%AE%9A%E6%96%87%E4%BB%B6%E4%B9%8B%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我想删除目录中的所有文件,同时只保留一些指定的文件,它们在名称上没有任何共同点。我怎样才能做到这一点?
例如,我要保留的文件名是:
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
这会执行以下操作:
find -type f
搜索所有文件的名称富及其子目录并将它们打印到 STDOUT。使用选项,-print0
它用 NUL 字节分隔文件名。grep -v -f bar
排除与以下行匹配的所有文件名酒吧。使用选项时-z
,它将其输入视为一组由 NUL 字节分隔的行,使用选项时,-Z
它将使用 NUL 字节分隔其输出。xargs rm
反复调用rm
删除文件。使用选项,-0
它将其输入视为一组由 NUL 字节分隔的行。
这适用于包含空格的文件名。