我想以递归方式转换所有文件,其中包含文件名中的特定字符串。输出文件名中的特定字符串应替换为另一个字符串。
我已经得到了第一部分 - 但是不知道如何替换输出文件名中的字符串。
输入文件应在文件名中包含“-default-”,该文件应由输出文件中的“-head-”关联。
感谢您的帮助:)
find . -name '*-default-*' -print0 | xargs -0 -L 1 -I {} convert -compress JPEG -resize "238" {} {}
答案 0 :(得分:2)
xargs
无法替换部分输入文件名,但这很容易解决。从xargs
运行一个简单的shell脚本,您可以随时获得shell的全部功能。
find . -name '*-default-*' -print0 |
xargs -0 -L 1 -I {} bash -c 'f="{}";
convert -compress JPEG -resize 238 "$f" "${f/-default-/-head-}"'
${var/str/subst}
语法为bashism;如果你需要POSIX兼容的shell脚本,它必须更多地参与其中。
如果您有棘手的文件名,可能包含例如:双引号,您可能必须使用独立脚本;这样的事情,也许是:
#!/bin/bash
for f; do
convert -compress JPEG -resize 238 "$f" "${f/-default-/-head-}"'
done
然后你可以... | xargs ./script
答案 1 :(得分:2)
作为tripleee注释,xargs不支持操作替换文件名。但是,shell循环可能会这样做并且更容易理解。像这样:
find . -name '*-default-*' |
while IFS='' read -r f; do
convert -compress JPEG -resize 238 "$f" "${f/-default-/-head-}"
done
将空字符串分配给IFS可防止丢失前导和尾随空格。 “-r”切换到“read”会禁止将反斜杠解释为转义字符。如果你想避免tripleee指出的基础,请使用sed。