0

我想递归地转换文件名中包含特定字符串的所有文件。输出文件名中的特定字符串应替换为另一个字符串。

我已经得到了第一部分 - 但不知道如何替换输出文件名中的字符串。

输入文件应在文件名中包含“-default-”,在输出文件中应替换为“-head-”。

谢谢你的帮助 :)

find . -name '*-default-*' -print0 | xargs -0 -L 1 -I {} convert -compress JPEG -resize "238"  {} {}
4

2 回答 2

2

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

于 2013-05-05T10:05:52.847 回答
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 提到的 bashism,请使用 sed。

于 2013-05-05T10:47:21.727 回答