我有一个目录,其中包含其他目录和深度未知的文件。 我怎样才能删除目录的内容 – 嵌套的目录和文件 – 而不是目录本身?
我试过这些,他们没有工作 – 没有被删除:
rm -rf my_dir/*/* rm -rf my_dir/** rm -rf my_dir/* # and cd my_dir rm -rf */*
怎么做?
使用查找。 仔细阅读本手册以了解各种选项并在此之前进行testing。
这里有一个使用mindepth的简单例子。 注意:如果你有一个非常深的树,很多文件查找可能会很慢,并导致文件系统问题和高负载(取决于文件系统和设置)。 请小心长时间运行查找命令的影响。 有办法find更快,更高效的阅读这些。
例如:这是我创build的结构
# tree my_dir/ my_dir/ |-- file |-- my_dir2 | `-- file2 `-- my_dir3 `-- file3
然后我们打电话找。 首先,我使用print来代替rm来确保我所得到的是我想要的。 这只是列出目录,你可以删除types来查看所有内容或添加-type文件。
# find my_dir -mindepth 1 -type d -print my_dir/my_dir3 my_dir/my_dir2
然后应用recursion删除(我在这里使用详细的testing):
#find my_dir -mindepth 1 -type d -exec rm -rv {} \; removed `my_dir/my_dir3/file3' removed directory: `my_dir/my_dir3' find: `my_dir/my_dir3': No such file or directory removed `my_dir/my_dir2/file2' removed directory: `my_dir/my_dir2' find: `my_dir/my_dir2': No such file or directory
你会得到“没有这样的文件错误”在这里查找sorting目录列表首先做一个recursionsearch。 如果需要,您可以禁止此错误消息。
现在检查树:
# tree ascii my_dir/ my_dir/ `-- file 0 directories, 1 file
因为我们说type -d和recursion删除它并没有删除第一级中的文件。 所以我们运行:
# find my_dir -mindepth 1 -type f -exec rm -rv {} \; removed `my_dir/file'
你可以在一个命令中做到这一点,以节省时间,但testing它。 现在再检查一次:
#tree my_dir 0 directories, 0 files
这可以改进,使得更优雅,但我希望这给你一个想法。