Как переименовать файлы, сохраняя только последние N символов

Как бы я рекурсивно переименул

Bluebellgray 19707 Rug P1.jpg
Bluebellgray Amal 1972407 Rug R1.jpg
Bluebellgray Random 1907 Rug R2.jpg
Words Amal 1707 Rug R3.jpg
Whatever 9707 Rug R4.jpg

на

P1.jpg
R1.jpg
R2.jpg
R3.jpg
R4.jpg

, мне интересуют только последние 6 символов.

Я предполагаю, что ответ начинается с Rename -n , а затем некоторое фанковое регулярное выражение? Чтобы получить его рекурсивным, мне нужно будет трусить и переименовать? Я также заинтересован только в файлах .jpg.

Спасибо

0
задан 29 January 2021 в 23:14

1 ответ

Как указано другие ответы, Nano - это текстовый редактор, который существует в терминале.

Используйте клавиши со стрелками и PG Up и PG Down ключей , чтобы переместить ваш текстовый курсор .

Использование Ctrl + Shift + C - Copy Выделенный текст.

Использование Ctrl + Shift + v - Вставка Текст в расположении текстового курсора.

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

Используйте Ctrl + o , а затем нажмите Введите на Сохранить изменения в ваш файл.

Использование Ctrl + x - Выход нано .

В Поиск текста в файле, используйте Ctrl + w , а затем введите поисковый запрос, а затем нажмите Введите Отказ Чтобы повторить последний поиск, нажмите Ctrl + w , а затем нажмите Введите , чтобы найти следующий экземпляр.

Также вы можете использовать Backspace и удалить клавиши для удаления одного символа за раз, и вы можете использовать Ctrl + k Чтобы удалить целую строку текста, но будьте осторожны, если вы используете линейную упаковку, и если вы не знакомы с новыми строками, которые иногда считаются абзацами, то не используйте Ctrl + k ] Так что вы не удалите что-то в аварии.

Вы можете найти здесь дополнительную информацию.

-121--911083-

В следующем удалите -N , как только вы будете довольны предлагаемыми преобразованиями.

С Rename :

rename -n 's/.*(..)\.jpg$/$1.jpg/' *.jpg

Чтобы сделать его рекурсировать в подкаталоги, у вас есть два варианта:

  1. Использование рекурсивной оболочки

     Shopt -S Globstar
    Переименуйте --nopath -n 'S / .* (..) \. jpg $ / $ 1.jpg /' ** / *. JPG
     
  2. Использование Найти

     Найти.  -Нам '* .jpg' -Execdir Rename --NOPATH -N 'S /.* (..) \. jpg $ / $ 1.jpg /' {} +
     

Обратите внимание на добавление опции - NoPath для предотвращения команды Rename от удаления ведущих элементов пути . Альтернативой будет изменение ведущих . * из шаблона регулярного выражения к [^] * . Также обратите внимание, что версия Globstar выйдет из строя, если количество совпадений слишком велико (или, точнее, если объединенная длина аргумента превышает arg_max ).


С MMV :

mmv -n '*??.jpg' '#2#3.jpg'

Это сложно сделать рекурсию, поскольку оно делает свой собственный сопоставление шаблона. Это может быть завернутый в найти -type d-dexecdir ... Команда, которую я полагаю.


Здесь удалите ECHO , как только вы будете довольны предлагаемыми преобразованиями.

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

for f in *.jpg; do echo mv -n -- "$f" "${f##* }"; done

Вы можете сделать этот рекурсион, используя Найти так же, как для Команда:

find . -name '*.jpg' -execdir sh -c 'for f; do echo mv -n -- "$f" "${f##* }"; done' sh {} +

Обратите внимание, что если вы хотите использовать версию MV «$ F» $ {F: -6} ", предложенные в Комментарий Raffa , вам понадобится Чтобы использовать одну из оболочек, которые поддерживают негативную индексацию подстроки, такие как Bash / ksh / ZSH для скрипта SH -C .

Вы могут использовать рекурсивный шар с контуром оболочки, но вам нужно будет отделить dirname и baseName, чтобы применить изменение параметра.

for f in ./**/*.jpg; do d="${f%/*}"; b="${f##*/}"; echo mv "$f" "$d/${b: -6}"; done
5
ответ дан 18 March 2021 в 23:39

Другие вопросы по тегам:

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