Найдите и замените последний символ '_' на '.' на имена файлов рекурсивно

Сервер NIM должен иметь тот же или более высокий уровень AIX, что и устанавливаемый клиент.

4
07.05.2020, 11:23
3 ответа

Он заменяет все экземпляры _, потому что ${1//_/.}является глобальным(${1/_/.}не будет -глобальным, но заменяет первое совпадение , а не последнее ).

Вместо этого вы можете использовать POSIX ${1%_*}и ${1##*_}, чтобы удалить самый короткий суффикс и самый длинный префикс, а затем воссоединить их:

find. -name '*_pdf' -type f -exec sh -c 'mv "$1" "${1%_*}.${1##*_}"' sh {} \;

или

find. -name '*_pdf' -type f -exec sh -c 'for f do mv "$f" "${f%_*}.${f##*_}"; done' sh {} +

Для нескольких внутренних номеров:

find. \( -name '*_pdf' -o -name '*_jpg' -o -name '*_jpeg' \) -type f -exec sh -c '
  for f do mv "$f" "${f%_*}.${f##*_}"; done
' sh {} +

Я удалил --конец -из -разделителя опций -здесь это не нужно, так как findпрефикс имен ./.

Вы можете добавить параметр -iк mv, если существует риск того, что в данном каталоге существуют и file_pdf, и file.pdf, и вы хотите, чтобы у вас была возможность не затирать существующий file.pdf. ].

13
28.04.2021, 23:16

С перламутровым renameинструментом:

find... rename 's/_pdf$/.pdf/' {} +

Вы можете запустить это отдельно для разных ваших расширений или заменить сразу несколько «общих расширений»:

find... rename 's/_(pdf|jpg|jpeg)$/.\1/' {} +

Если у вас нет perl rename, вы можете использовать другойrenameинструмент:

find... rename '_pdf' '.pdf' {} +
7
28.04.2021, 23:16

Обязательная zshверсия:

autoload zmv # best in ~/.zshrc
zmv -v '(**/)(*)_(pdf|jpg|jpeg)(#q.)' '$1$2.$3'

((#q.)заключается в ограничении обычными файлами, как это делает find-type f. Измените на (#qD.), если вы также хотите переименовать скрытые файлы или файлы в скрытых каталогах, как это делает find. Замените -vна -nдля работы всухую -).

4
28.04.2021, 23:16

Теги

Похожие вопросы