这个查找状态在将文件向上移动到一个目录时实际上是如何工作的?

这个查找状态在将文件向上移动到一个目录时实际上是如何工作的?

有人能解释一下这个 find 语句中的字符串操作实际上是如何工作的吗?我快要爆炸了,想弄清楚。:-o

从:UNIX shell 脚本:如何递归地将文件向上移动一个目录?

find ".mp3" -type f -exec sh -c 'mv -i "$1" "${1%/*}/.."' sh {} \;

上面的代码将所有带有后缀的文件.mp3精确地向上移动一个目录,这正是我想要的。想要了解有关 shell 脚本的更多信息,我试图理解上述语句中的(嗯,几乎所有内容)。

mv带有$1和的语句${1%/*}/..

为什么sh {}最后是 the?为什么sh还有两个 s?

任何语法的细分都很好。我看过 Bash Manipulation 文档,但我对这"$1" "${1%/*}/.."部分尤其感到困惑。

答案1

首先,这并不像您所说的那样有效。它只会查找常规文件.mp3(而不是所有具有该扩展名的文件),或者,如果.mp3是目录,则递归地在其中查找,查找其下的所有常规文件。您可以-name "*.mp3"改为使用查找目录下的所有 .mp3 常规文件。

现在,您提到的答案中的命令是

find A -type f -exec sh -c 'mv -i "$1" "${1%/*}/.."' sh {} \;

据称用于“标准find,即 POSIX find,而不是您系统中可能存在的 GNU find。它们之间存在一些差异,因此请POSIXfind手册在这里指导我们。

该命令从目录开始递归查找常规文件,如果不存在这样的目录,则在当前目录中A查找常规文件。A

现在到了复杂的部分。根据手册,该-exec选项的形式为

-exec utility_name [argument ...] ;

看到它的sh用法utility_namesh -c表示“执行以下字符串”,即

mv -i "$1" "${1%/*}/.."

  • $1是找到的文件,由 提供{}
  • $0是第二个sh(啊哈!),所以这里sh实际上什么也没做,只是一个占位符。
  • ${1%/*}/..意思是:获取,从末尾$1删除最短的匹配项(即斜杠 + 其基本名称),将其附加到结果中,最终结果即为其父目录!例如,经历以下转换:→ → → 。/*/..A/B/Music/x.mp3A/B/Music/x.mp3A/B/MusicA/B/Music/..A/B

因此,最后您得到了一个简洁的 POSIX 方法来使用 来上移该文件find


%有关出现的符号(以及它的朋友)的更多信息#https://stackoverflow.com/a/34952009

相关内容