我可以使用以下方法删除目标目录并递归删除其所有子目录和内容。
find '/target/directory/' -type d -name '*' -print0 | xargs -0 rm -rf
但是,我并不想删除目标目录。如何才能只删除目标中的文件、子目录及其内容?
答案1
前面的答案几乎是正确的。但是,你不应该引用shell glob 字符如果你想让它们工作。所以,这是你要找的命令:
rm -rf "/target/directory with spaces/"*
请注意,* 在双引号之外。此形式也有效:
rm -rf /target/directory\ with\ spaces/*
如果您*
如上所示将 放在引号中,那么它将只会尝试删除*
目标目录内字面上命名的单个文件。
答案2
另外三个选项。
find
与-mindepth 1
和 一起使用-delete
:−mindepth levels
不要在低于 levels(非负整数)的级别应用任何测试或操作。
−mindepth 1 表示处理除命令行参数之外的所有文件。-delete
删除文件;如果删除成功则为 true。如果删除失败,则发出错误消息。如果 −delete 失败,find 的退出状态将为非零(当它最终退出时)。使用 −delete 会自动打开 −depth 选项。
在使用此选项之前,请先使用 -depth 选项仔细测试。# optimal? # -xdev don't follow links to other filesystems find '/target/dir with spaces/' -xdev -mindepth 1 -delete # Sergey's version # -xdev don't follow links to other filesystems # -depth process depth-first not breadth-first find '/target/dir with spaces/' -xdev -depth -mindepth1 -exec rm -rf {} \;
2. 使用find
,但针对的是文件,而不是目录。这样就无需rm -rf
:
# delete all the files;
find '/target/dir with spaces/' -type f -exec rm {} \;
# then get all the dirs but parent
find '/target/dir with spaces/' -mindepth 1 -depth -type d -exec rmdir {} \;
# near-equivalent, slightly easier for new users to remember
find '/target/dir with spaces/' -type f -print0 | xargs -0 rm
find '/target/dir with spaces/' -mindepth 1 -depth -type d -print0 | xargs -0 rmdir
3. 继续删除父目录,但重新创建它。您可以创建一个 bash 函数来使用一个命令执行此操作;这里有一个简单的单行命令:
rm -rf '/target/dir with spaces' ; mkdir '/target/dir with spaces'
答案3
怎么样
rm -rf /target/directory\ path/*
如果目标目录中可能有以 . 开头的文件。
rm -rf "/target/directory path/*" "/target/directory path/.??*"
第二个将匹配以 . 开头的所有内容,除了 . 和 .。它将在 .a 这样的名称上失败,但这种情况并不常见。如有必要,可以对其进行调整以涵盖所有情况。
答案4
find /target/directory/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;