3 ms·
In sh, the correct version would be for f in ./*2019*.jpg ; do convert "$f" album/"$f" # just don't use xargs done Note the prepended ./ whic
by jstimpfle 7y ago
In sh, the correct version would be
for f in ./*2019*.jpg ; do
convert "$f" album/"$f" # just don't use xargs
done
Note the prepended ./ which is necessary if you want to protect against filenames that look like command line switches (a file named "-rf" can be pretty dangerous)
If you wanted to use xargs and still make it perfectly safe with regards to spaces and quoting, you could use a GNU extension:
find . -maxdepth 1 -name '*2019*.jpg' -print0 | xargs -0 convertalbum.sh
# convertalbum.sh
convert "$1" album/"$1"
find prints the files terminated by ASCII NUL characters, xargs can understand this format if you give it the -0 option.
There are still problems around detecting errors in pipes, though.
- enriquto 7y ago> just don't use xargs the whole point of my example was to show how easy parallelism is. You create a list of tasks, then you pipe the list to xargs or gnu parallel.
- jstimpfle 7y agoYou can't write ASCII NUL characters from portable shell, that's why this task cannot be done correctly (for all possible filenames) from shell. You need to use tools like find(1) So, no, it's not easy, at least not if you want to handle all cases without wreaking havoc.
- chubot 7y agoPractically speaking, you can write NUL from shell because bash is everywhere, busybox ash emulates a lot of bash, etc. However I won't claim it's pretty or easy for people to use, so the point of Oil is basically to clean up patterns like this, e.g. find -print0 | xargs -0 and more. This post uses a related problem and solution as design motivation for Oil: How to Quickly and Correctly Generate a Git Log in HTML http://www.oilshell.org/blog/2017/09/19.html http://www.oilshell.org/blog/2017/09/19.html