是否可以使用 rm 递归删除与模式匹配的文件和目录而不使用其他命令?
答案1
直接回答你的问题,“不 - 你不能做你所描述的事情rm
”。
你能但是,如果你将它与 结合起来,就可以了find
。以下是你可以做到的众多方法之一:
# search for everything in this tree, search for the file pattern, pipe to rm
find . | grep <pattern> | xargs rm
例如,如果您想要删除所有 *~ 文件,您可以这样做:
# the $ anchors the grep search to the last character on the line
find . -type f | grep '~'$ | xargs rm
从评论中扩展*:
# this will handle spaces of funky characters in file names
find -type f -name '*~' -print0 | xargs -0 rm
答案2
“无需使用其他命令”
不。
答案3
使用 Bash 和globstar
set,是的:
rm basedir/**/my*pattern*
首先尝试使用例如ls -1
,然后rm
列出匹配的文件。
您可以通过例如设置选项shopt -s globstar
。
或者,更短的find
版本:
find -type f -name 'my*pattern*' -delete
或者对于 GNU find
:
find -type f -name 'my*pattern*' -exec rm {} +
或者另一个非 GNU 的替代方案find
(速度稍慢):
find -type f -name 'my*pattern*' -exec rm {} \;
要删除目录,正如您所要求的:只需在上述命令中更改为,然后仅rm
在命令中跳过匹配。rm -r
-type f
find
答案4
如果你使用zsh(1),在 .zshrc 中打开“扩展通配符” setopt extendedglob
。在模式前加上 '**/' 将会递归删除:
% rm -rf **/<模式>
然而,如果有很多删除的文件你应该采取查找(1)和xargs(1)或 -exec,并且我也建议在 shell 脚本中执行此操作。