我不小心将目录中的文件夹复制Music
到了父michal
目录中。我想一举删除这些目录。
有什么办法可以完成以下工作吗?或者有更好的选择吗?
/home/michal/Music $ find . -type d -maxdepth 1 -exec rm -r ../{} \;
显然{}
没有被替换,因为上面返回
rm: ../{}: No such file or directory
rm: ../{}: No such file or directory
rm: ../{}: No such file or directory
...
答案1
你的find
命令对我来说 GNU 工作得很好find
。如果它在您的系统上不起作用,请尝试:
find . -maxdepth 1 -type d -exec sh -c 'rm -r "../$1"' Rm {} \;
此方法用作{}
独立参数,未经 修改../
。我们将 的值传递{}
给 shell,然后 shell 应用../
。
笔记:
-maxdepth 1
和的顺序-type d
相反,因为man find
建议-maxdepth
在位置选项(如 )之前定义全局选项(如 )-type
。shell 命令必须用单引号括起来:
'rm -r "../$1"'
。如果它用双引号括起来,则原始 shell 会将其值替换为$1
,并且 找到的目录名将find
被忽略。我们需要被呼召的人sh
来做替换。该字符串"../$1"
用双引号括起来,以保护目录名$1
免遭分词和路径名扩展。shell 将字符串分配
Rm
给$0
.除非出现错误消息,否则不会使用此选项。因此,可以使用任何字符串。
答案2
和zsh
:
cd /home/michal &&
rm -rf -- Music/*(/D:t)
glob/
限定符是只选择目录,D
包括隐藏的目录,而:t
历史扩展中的修饰符是只选择尾巴(不带目录部分的文件名)。
对于任何类似 Bourne 的 shell:
cd /home/michal/Music &&
set -- */ &&
cd .. &&
rm -rf -- "$@"
但与上述的一个区别是,它还将包含目录的符号链接(并且会删除目标的内容而不是链接本身)。