gpt4 book ai didi

linux - 如何在 GNU/Linux cli 上使用 find regex 排除新行(回车)?

转载 作者:太空宇宙 更新时间:2023-11-04 11:53:19 25 4
gpt4 key购买 nike

我正在尝试将目录中具有 de JPG 扩展名的所有文件重命名为小写的 jpg。我在 this post 的帮助下制作了这个 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 美元没有值(value)。您应该知道 $1 实际上是指传递给 sh 的第二个参数。即 sh -c 'code' $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}"
' {} \;

关于linux - 如何在 GNU/Linux cli 上使用 find regex 排除新行(回车)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55330336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com