如何在 GNU/Linux cli 上使用查找正则表达式排除新行(回车符)



我正在尝试将扩展名为 de JPG 的目录中的所有文件重命名为小写 jpg。我在这篇文章的帮助下制作了这个 bash 代码:

find . -regex ".*.JPG" -exec sh -c 'echo "$0" | sed -r "s/.JPG/.jpg/" && mv "$0" "$1"' {} ;

但是我收到以下错误:

./IMG_1352.jpg
mv: cannot move './IMG_1352.JPG' to '': No such file or directory
(and so on...)

我想我需要更改名称"地",但我不知道如何更改。

TL;DR:试试这段代码:

find . -name '*.JPG' -type f -exec sh -c 'mv $0  ${0/.JPG/.jpg}' {}  ;

更多评论:

您的代码非常接近它需要的位置。 但是,有一个问题,即没有定义多达 1 美元。

我运行了以下代码来计算 1 美元的价值。

$ ls
bye.jpg hi.JPG
$ find . -regex ".*.JPG" -exec sh -c 'echo "$0" | sed  "s/.JPG/.jpg/" && echo "0:$0 1:$1" ' {} ;
./hi.jpg
0:./hi.JPG 1:

根据我上面的结果,1 美元没有价值。 您应该知道 $1 实际上是指传递给 sh 的第二个参数。 也就是说,sh -c '代码' $0 $1 ...

无论如何,您需要在变量中捕获 sed 命令的结果,以将其传递给 move 命令,如下所示:

find . -regex ".*.JPG" -exec sh -c '
    lower=$( echo "$0" | sed -r "s/.JPG/.jpg/" )
    mv "$0" "$lower"
' {}  ;

综上所述,您可以使其更简洁。 正如PS所建议的那样,for循环是一个不错的选择。 此外,根据PS的建议,JPG -> jpb替换更具可读性。 如果您喜欢使用find,则可以合并PS的建议,如下所示:

find . -regex ".*.JPG" -exec sh -c '
    filename=$0
    mv "$filename" "${filename/.JPG/.jpg}"
' {}  ;

最新更新