我有一个目录,其中包含其他目录和未知深度的文件。我该如何删除它?仅限内容目录——嵌套的目录和文件——但不是目录本身?
我尝试过这些,但没有用——什么都没有删除:
rm -rf my_dir/*/*
rm -rf my_dir/**
rm -rf my_dir/*
# and
cd my_dir
rm -rf */*
怎么做?
答案1
使用 find。在执行此操作之前,请仔细阅读手册以了解各种选项并进行测试。
这是一个使用 mindepth 的简单示例。 笔记:如果您的树非常深且文件很多,则 find 可能会很慢并导致文件系统问题和高负载(取决于文件系统和设置)。请注意长时间运行 find 命令的影响。有多种方法可以使 find 更快、更高效,因此请阅读这些方法。
例如:这是我创建的结构
# tree my_dir/
my_dir/
|-- file
|-- my_dir2
| `-- file2
`-- my_dir3
`-- file3
然后我们调用 find。首先,我使用 print 而不是 rm 来确保我得到的是我想要的。这只列出了目录,您可以删除类型以查看所有内容或添加 -type 文件。
# find my_dir -mindepth 1 -type d -print
my_dir/my_dir3
my_dir/my_dir2
然后应用递归删除(我在这里使用详细进行测试):
#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
由于 find 首先对目录列表进行排序以进行递归搜索,因此您将在此处收到“无此文件错误”。如果需要,您可以隐藏此错误消息。
现在检查树:
# tree ascii my_dir/
my_dir/
`-- file
0 directories, 1 file
因为我们说了 type -d 和递归删除,所以它不会删除第一级的文件。所以我们运行:
# find my_dir -mindepth 1 -type f -exec rm -rv {} \;
removed `my_dir/file'
您可以在一条命令中执行此操作以节省时间,但请进行测试。现在再检查一下:
#tree my_dir
0 directories, 0 files
这可以改进并变得更优雅,但我希望这能给你一个想法。