递归删除目录的内容但不删除目录本身

递归删除目录的内容但不删除目录本身

我有一个目录,其中包含其他目录和未知深度的文件。我该如何删除它?仅限内容目录——嵌套的目录和文件——但不是目录本身?

我尝试过这些,但没有用——什么都没有删除:

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

这可以改进并变得更优雅,但我希望这能给你一个想法。

相关内容