有人能解释一下这个 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_name
。sh -c
表示“执行以下字符串”,即
mv -i "$1" "${1%/*}/.."
$1
是找到的文件,由 提供{}
。$0
是第二个sh
(啊哈!),所以这里sh
实际上什么也没做,只是一个占位符。${1%/*}/..
意思是:获取,从末尾$1
删除最短的匹配项(即斜杠 + 其基本名称),将其附加到结果中,最终结果即为其父目录!例如,经历以下转换:→ → → 。/*
/..
A/B/Music/x.mp3
A/B/Music/x.mp3
A/B/Music
A/B/Music/..
A/B
因此,最后您得到了一个简洁的 POSIX 方法来使用 来上移该文件find
。
%
有关出现的符号(以及它的朋友)的更多信息#
:https://stackoverflow.com/a/34952009