find 命令:在路径中使用 {}

find 命令:在路径中使用 {}

我不小心将目录中的文件夹复制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 应用../

笔记:

  1. -maxdepth 1和的顺序-type d相反,因为man find建议-maxdepth在位置选项(如 )之前定义全局选项(如 ) -type

  2. shell 命令必须用单引号括起来:'rm -r "../$1"'。如果它用双引号括起来,则原始 shell 会将其值替换为$1,并且 找到的目录名将find被忽略。我们需要被呼召的人sh来做替换。该字符串"../$1"用双引号括起来,以保护目录名$1免遭分词和路径名扩展。

  3. 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 -- "$@"

但与上述的一个区别是,它还将包含目录的符号链接(并且会删除目标的内容而不是链接本身)。

相关内容