Как исключить новые строки (возврат каретки), используя регулярное выражение find в GNU / Linux cli? - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь переименовать все файлы в каталоге с расширением 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...)

Я думаю, что мне нужноизменить названия "места", но я не знаю, как.

1 Ответ

0 голосов
/ 25 марта 2019

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 'code' $ 0 $ 1 ...

В любом случае вам нужно будет записать результат команды sed в переменную, чтобы передать его команде перемещения следующим образом:

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

Все, что сказано, вы могли бы сделать это более кратким.Как подсказывает PS, цикл for - это хороший выбор.Кроме того, замена JPG -> jpb более читабельна с предложением PS.Если вы проданы с использованием find, вы можете включить предложение PS следующим образом:

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