如何使用xargs替换2个参数

时间:2016-09-13 21:19:44

标签: bash shell sh

我想编写一个脚本,使用svgexport cli

将目录中的svg文件转换为png
svgexport input.svg input.jpg

如何使用find和xargs -I {}使用以下命令查找和打印svg文件:

find . -iname -0 "*.svg" | xargs -I {} svgexport {} ???

如何使用第一个参数填充第二个参数并将.svg替换为.jpg?

5 个答案:

答案 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%???}

如果你想避免使用bashfind 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"并且您可以添加新的文件扩展名。