使用convert时替换filename中的字符串

时间:2013-05-05 09:31:48

标签: bash

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

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

输入文件应在文件名中包含“-default-”,该文件应由输出文件中的“-head-”关联。

感谢您的帮助:)

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

2 个答案:

答案 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。