我想递归地转换文件名中包含特定字符串的所有文件。输出文件名中的特定字符串应替换为另一个字符串。
我已经得到了第一部分 - 但不知道如何替换输出文件名中的字符串。
输入文件应在文件名中包含“-default-”,在输出文件中应替换为“-head-”。
谢谢你的帮助 :)
find . -name '*-default-*' -print0 | xargs -0 -L 1 -I {} convert -compress JPEG -resize "238" {} {}
我想递归地转换文件名中包含特定字符串的所有文件。输出文件名中的特定字符串应替换为另一个字符串。
我已经得到了第一部分 - 但不知道如何替换输出文件名中的字符串。
输入文件应在文件名中包含“-default-”,在输出文件中应替换为“-head-”。
谢谢你的帮助 :)
find . -name '*-default-*' -print0 | xargs -0 -L 1 -I {} convert -compress JPEG -resize "238" {} {}
xargs
无法替换输入文件名的部分内容,但这很容易解决。运行一个简单的 shell 脚本xargs
,你就可以得到完整的 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
正如 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 提到的 bashism,请使用 sed。