I ran the following command in shell to batch convert .HEIC
files to .JPG
files, the command is successful, however there's a part of it I don't understand:
find . -name '*.HEIC' -exec sh -c 'magick convert $1 "${1%.HEIC}.JPG"' _ {} \;
Apparently _ {}
acts to assign find
result to $1
, but how? I can't find an explanation on google nor here, and didn't have any luck with man find
. It's entirely possible that answers were here but these symbols are not very nice to search for.
So the question is, how does _ {}
assign variable to $1
? Is it possible to assign multiple variable to it with find/ or other commands?
There are two things involved in how _ {}
assigns the filename to $1
. First, is how the find
's -exec
works: it runs the following arguments (up to the escaped ;
) as a command, but with {}
replaced with the path to the file it found. Thus, if it finds ./somefile.HEIC
, it'll run the equivalent of the command:
sh -c 'magick convert $1 "${1%.HEIC}.JPG"' _ ./somefile.HEIC
The second part is the sh
command. sh
can do a number of things, but if it's given a -c
option, it takes the immediately following argument (magick convert $1 "${1%.HEIC}.JPG"
) as a command string to parse and run, sort of like a little mini-script. The arguments after that are taken as arguments to that mini-script, starting with $0
. In this case, that means it runs the mini-script with $0
set to _
, and $1
set to "./somefile.HEIC". If more arguments were supplied, they'd be $2
, $3
, etc.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With