如何删除Unix中除一个文件外的所有文件?[重复]


Answers:


20
ls * | grep -v dont_delete_this_file | xargs rm -rf 

范例:

mkdir test && cd test
touch test1
touch test2
touch test3
touch test4
touch test5

要删除除“ test2”以外的所有文件:

ls * | grep -v test2 | xargs rm -rf

然后“ ls”输出为:

test2

编辑:

感谢您的评论。如果目录包含一些带有空格的文件:

mkdir test && cd test
touch "test 1"
touch "test 2"
touch "test 3"
touch "test 4"
touch "test 5"

您可以使用(与bash一起使用):

rm !("test 1"|"test 4")

'ls'输出:

test 1
test 4

使用find会做非常相似的事情,但是您的工作正常,并且速度更快。+1
罗里·阿尔索普

2
如果您的文件名中带有空格,则此操作将失败。

要使用带空格的文件名,可以使用ls -1 | grep -v do_not_delete | xargs -I files rm "files"
sebhofer 2013年

8

假设您正在使用bash shell(最常见的情况),则可以使用取反globbing(路径名扩展)符号:

rm -rf !(myfile.txt)

这使用扩展的globing,因此您需要首先启用此功能:

shopt -s extglob




0

对于递归,rm您需要使用递归find并排除要保留的文件(或grep,但这会使您陷入空白麻烦)。对于Shell Glob,现代Shell具有可用于排除文件的Glob模式。可用时,可以将其与shell级glob递归结合使用(例如,zsh具有rm **/*~foo/bar-请注意,这可能会遇到大型目录树的参数长度限制)。

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.