在find exec命令中的变量

4
在这个find命令中,$ 1是如何工作的? 我找不到任何关于它在做什么方面的例子或文档。 这来自一个问题“删除当前工作目录中的所有文件扩展名。”
find `pwd` -type f -exec bash -c 'mv "$1" "${1%.*}"' - '{}' \;

出于众多原因,最好使用find $(pwd) -type f …而不是find `pwd` -type f …。当然,在当前情况下,这并不重要,但现在养成良好的习惯将在真正需要时受益无穷。 - Jonathan Leffler
这是一个很好的观点!谢谢你! - Stats4224
1
实际上,更喜欢使用 find "$(pwd)" ... 确保使用字面目录名称,而不是将其置于单词拆分或路径名扩展的影响下。 - chepner
1个回答

8
< p >< code >find< /code >要执行的字符串是:< /p >
bash -c 'mv "$1" "${1%.*}"' - '{}'

对于每个找到的文件,find 将会用找到的文件的路径名替换 {}

bash -c 'mv "$1" "${1%.*}"' - '/path/to/filename.ext'

bash 然后以 $0 设置为 -(使其成为登录 shell)并将 $1 设置为 /path/to/filename.ext 的方式执行 mv "$1" "${1%.*}"。应用替换后,结果如下:

mv /path/to/filename.ext /path/to/filename

注意:`find 'pwd'` 是表达 `find .` 的一种复杂方式。

明白了,谢谢!我太专注于执行程序了,没有意识到bash -c在做什么。 - Stats4224
这真的会使它成为登录 shell 吗?我认为在 bash -c$0 只是用作进程的名称。 - Benjamin W.
@BenjaminW.: man bash: "登录 shell 是指其参数零的第一个字符为 -,或者使用 --login 选项启动的 shell"。 - AlexP
我还不确定。试试这个:bash -c 'echo $0; shopt login_shell' - - 这表示它不是登录 shell。另一方面,bash --login -c 'echo $0; shopt login_shell' whatever 是一个登录 shell,尽管 $0 不以 - 开头。你也可以在 .bash_profile 中放置一个 echo 语句,并查看何时执行:只有使用 --login 时才会执行。我看到 $0 实际上是 -bash 的登录 shell 唯一的时间是通过 Ctrl+Alt+F1 可达的虚拟控制台。 - Benjamin W.
我猜最终答案在这个source里。 - Benjamin W.
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接