我想编写一个脚本,使用svgexport cli
将目录中的svg文件转换为pngsvgexport input.svg input.jpg
如何使用find和xargs -I {}使用以下命令查找和打印svg文件:
find . -iname -0 "*.svg" | xargs -I {} svgexport {} ???
如何使用第一个参数填充第二个参数并将.svg替换为.jpg?
答案 0 :(得分:4)
我认为最好使用while
循环执行此操作:
find . -iname "*.svg" -print0 |
while IFS= read -r -d '' file; do
svgexport "$file" "${file%.svg}.jpg"
do
答案 1 :(得分:3)
与 GNU Parallel
并行,简单,快捷地完成所有操作parallel --dry-run svgexport {} {.}.jpg ::: *.svg
如果您喜欢它显示的内容,请删除--dry-run
并再次运行以实际处理文件。
答案 2 :(得分:2)
您可以在bash -c
中使用xargs
并使用BASH的字符串替换:
find . -name "*.svg" -print0 |
xargs -0 -I {} bash -c 'svgexport "$1" "${1%.svg}.jpg"' - {}
答案 3 :(得分:2)
使用xargs
时可以避免find
。它已经以更简单的方式提供了相同的功能(-exec
和+
终结符):
find . -iname "*.svg" -exec \
bash -c 'for i do svgexport "$i" "${i::-3}jpg";done' bash {} +
如果你不想在子目录中递归:
find . -maxdepth 1 -iname "*.svg" -exec \
bash -c 'for i do svgexport "$i" "${i::-3}jpg";done' bash {} +
但在这种情况下,find
也不是必需的:
for i in *.[sS][vV][gG]; do svgexport "$i" "${i::-3}jpg"; done
如果后缀始终为小写,则可以稍微简化一下:
for i in *.svg; do svgexport "$i" "${i%svg}jpg"; done
如果您的bash
版本不支持${i::-3}
,则可以改为使用便携式{i%???}
。
如果你想避免使用bash
和find
GNUisms,这里有一种实现递归处理的POSIX方法:
find . -name "*.[Ss][Vv][Gg]" -exec \
sh -c 'for i do svgexport "$i" "${i%???}jpg";done' sh {} +
和另一个非递归的:
for i in *.svg; do svgexport "$i" "${i%???}jpg"; done
答案 4 :(得分:0)
易:
find . -iname "*.svg" -print0 | xargs -0 -I \
bash -c 'export file="{}"; svgexport "$file" "${file%.*}.jpg"'
添加-print0以查找和-0到xargs以处理特殊文件名。 $ {file%。*}删除最后一个点后的所有字符,因此它将删除" .svg"并且您可以添加新的文件扩展名。