递归删除所有文件,除了一些特定类型。

6

我希望能够递归删除某些文件夹中除了具有 .gz 扩展名之外的所有文件。通常我会使用

find /thepath -name "foo" -print0 | xargs -0 rm -rf

我希望能够递归删除/thepath目录下所有名为"foo"的文件夹。但现在我想添加一个排除选项。这可能吗?

例如,文件夹结构如下:

 .hiddenfolder
 .hiddenfolder/bin.so
 arc.tar.gz
 note.txt
 sample

我想删除所有东西,但保留arc.tar.gz

2个回答

8

查找并删除/thepath下除*.gz以外的所有文件:

# First check with ls -l
find /thepath -type f ! -name '*.gz' -print0 | xargs -0 ls -l

# Ok: delete
find /thepath -type f ! -name '*.gz' -print0 | xargs -0 rm -vf

还有,要删除所有空的剩余目录:

find /thepath -type d -empty -print0 | xargs -0 rmdir -v

对于那些徘徊和偶然遇到这条回复的人,GNU find 实用程序也有 -delete 选项,我个人认为使用起来很方便。我喜欢 @grebneke 添加了最后一行代码,他检查了空目录。 - alvits
我可能会使用-exec来列出或删除文件... 大多数版本支持以+而不是\;结尾以传递多个参数。此外,-empty在Solaris上不可移植(我通常只是尝试rmdir并让它为非空目录生成错误信息...)。 - Gert van den Berg

2

我认为

find /thepath -name "foo" ! -name "*.gz" -print0

应该能够生成正确的文件名列表,但在将输出传输到xargs命令执行实际删除之前,请进行检查。

我使用了 find . -name "*" ! -name "*.gz" -print0 但它只打印目录内容。 - mahmood
2
只需像之前一样将其管道传递给xargs即可。我认为@chepner没有提到这一点是为了防止人们在复制和粘贴时意外地删除他们的文件。 - Mzzl
是的,但grebneke的解决方案更加方便,真正地添加了-type f。祝好! - mahmood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接