递归删除所有文件,而不删除目录


10

我想“清理”目录中的所有文件,包括子目录中的所有文件,但我想保留子目录。我的理解rm -r是,它也会删除子目录本身。

希望删除隐藏(点)文件。

如何才能做到这一点?


1
find -type f ! -name "[.]*" -delete不适合吗?
Costas

我不知道。那符合我的要求吗?
Scott Wilton 2015年

不尝试-delete-仅打印要删除的文件名。
Costas

是否要删除隐藏目录中的文件(是否隐藏)?
斯特凡Chazelas

关于目录的符号链接呢?
斯特凡Chazelas

Answers:


10

用途find为:

find . ! -name '.*' ! -type d -exec rm -- {} +

1
并非所有找到的实现都具有-delete
wurtel

3
@RomeoNinov请阅读OP问题:I do not want to delete hidden (dot) files.
jimmij

1
@Costas,不,没有外壳需要转义+(至少在Bourne,csh或rc系列中不需要)。有一个传说说有些旧版本csh需要转义,{}但我从未遇到过。
斯特凡Chazelas

1
@ScottWilton包含隐藏目录,但不包含隐藏目录中的隐藏文件。如果要拒绝隐藏目录中的所有文件,find . ! -name '.*' ! -type d ! -path '*/.*'则应执行此操作。
jimmij 2015年

1
@jimmy,更希望find . -name '.?*' -prune -o ! -type d -exec rm {} +避免完全堕落。请注意,--由于路径以开头,因此此处没有必要(虽然没有害处)./
斯特凡Chazelas

0

尝试类似:

find <path> ! -name '.*' -type f -exec rm {} \;

有什么理由为什么一次要删除文件而不是加快处理速度.... -exec rm {} +
Anthon 2015年

我喜欢一一做。大规模(和并行)操作有时会产生奇怪的(
且不

1
-exec rm {} +不是并行的,它仅rm使用几个文件名进行调用。它运行的rm调用较少,因此对资源更友好。如果这样做的安全性稍差一些,则会扩大竞赛窗口,在该窗口中要删除的文件的目录组件可能会更改为符号链接。但只有-delete-execdir rm {} \;会完全解决这一问题。
斯特凡Chazelas

@StéphaneChazelas在UNIX中不存在(-delete或-execdir)。而且我没有看到有问题的Linux被提及!
罗密欧·尼诺夫

@RomeoNinov,是的,我在这里的另一条评论中说,这只是-exec标准。-delete并且-execdir来自BSD,大约10年后,GNU添加了它们。无论如何,这与仅是内核的Linux无关。
斯特凡Chazelas
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.