【发布时间】:2011-08-22 15:05:24
【问题描述】:
我在一个目录中有数百个目录和文件。
只删除目录的最佳方法是什么(无论目录是否有任何内容,都将它们全部删除)
目前我使用ls -1 -d */,并将它们记录在一个文件中,然后执行sed,然后运行它。它相当长的路。我正在寻找仅删除目录的更好方法
【问题讨论】:
我在一个目录中有数百个目录和文件。
只删除目录的最佳方法是什么(无论目录是否有任何内容,都将它们全部删除)
目前我使用ls -1 -d */,并将它们记录在一个文件中,然后执行sed,然后运行它。它相当长的路。我正在寻找仅删除目录的更好方法
【问题讨论】:
要删除所有目录和子目录,只保留工作目录中的文件,我发现这个简洁的命令对我有用:
rm -r */
它使用 bash 通配符 */,其中星号后跟斜杠将仅匹配目录和子目录。
【讨论】:
find . -maxdepth 1 -mindepth 1 -type d 的命令是一个更好的选择
rm -rf ./*/也距离rm -rf /*/仅一个字符
find . -maxdepth 1 -mindepth 1 -type d
然后
find . -maxdepth 1 -mindepth 1 -type d -exec rm -rf '{}' \;
添加解释:
find 由于. 而在当前目录中开始,并且仅在-maxdepth 和-mindepth 都设置为1 时停留在当前目录中。 -type d 告诉 find 只匹配目录。
find 也有一个-exec 标志,可以将其结果传递给另一个函数,在本例中为rm。 '{}' \; 是传递这些结果的方式。 See this answer for a more complete explanation of what {} and \; do
【讨论】:
首先,运行:
find /path -d -type d
为了确保输出看起来正常,然后:
find /path -d -type d -exec rm -rf '{}' \;
-type d 只查找目录,然后-d 确保将子目录放在父目录之前。
【讨论】:
find /path -d -type d
简单的方法:-
rm -rf `ls -d */`
【讨论】:
一行:
rm -R `ls -1 -d */`
(反引号)
【讨论】:
ls; 尤其是不要rm -r。当路径名包含空格时会失败。