有人可以在本bash末尾解释符号的内部工作吗:“ _ {} \;”

Roc*_* Li 4 bash shell exec find

我在外壳中运行以下命令以将.HEIC文件批量转换为.JPG文件,该命令成功完成,但是有一部分我不理解:

find . -name '*.HEIC' -exec sh -c 'magick convert $1 "${1%.HEIC}.JPG"' _ {} \;
Run Code Online (Sandbox Code Playgroud)

显然_ {}是将find结果分配给$1,但是如何?我在Google或这里都找不到解释,也没有运气man find。答案很可能在这里,但是这些符号并不是很好地搜索。

所以问题是,如何_ {}将变量分配给$1?是否可以使用find /或其他命令为其分配多个变量?

Gor*_*son 6

如何_ {}将文件名分配给$1。首先是find-exec工作方式:它将以下参数;作为命令运行(直到转义的),但将其{}替换为找到的文件的路径。因此,如果找到./somefile.HEIC,它将运行与命令等效的命令:

sh -c 'magick convert $1 "${1%.HEIC}.JPG"' _ ./somefile.HEIC
Run Code Online (Sandbox Code Playgroud)

第二部分是sh命令。sh可以做很多事情,但是如果给了一个-c选项,它将紧随其后的参数(magick convert $1 "${1%.HEIC}.JPG")作为要分析和运行的命令字符串,有点像一个小脚本。之后的参数将作为该小型脚本的参数,以开头$0。在这种情况下,这意味着它将运行$0设置为的迷你脚本_,并将其$1设置为“ ./somefile.HEIC”。如果有更多的论据提供,他们会$2$3等等。

  • 谢谢,这非常清楚且有帮助。这是否意味着 _ 不是必需的,我可以使用 $0 代替?使用1美元有什么好处吗? (2认同)
  • @Inian两项均正确。您可以使用$ 0传递文件名,但是$ 0通常是正在执行的程序(脚本,可执行文件等)的名称,将其用作正在运行的文件可能会引起混淆。(“ _”也不是一个很好的程序名,但至少不会主动引起误解。)至于为每个文件运行迷你脚本,这就是`-exec ... \;`的工作方式。如果使用`-exec ... +`,它将大批量运行它们,因此文件名将是$ 1,$ 2,... $ {148}等。您可以执行此操作,但是随后需要在微型脚本中进行处理循环。 (2认同)