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 /或其他命令为其分配多个变量?
如何_ {}将文件名分配给$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等等。