Рекурсивно изменять расширения файлов в Bash

87

Я хочу , чтобы рекурсивно итерацию через каталог и изменить расширение всех файлов определенного расширения, скажем , .t1к .t2. Что для этого используется команда bash?

Амаль Энтони
источник
14
imho, это не повторяющийся вопрос - другой вопрос не рекурсивный
пользователь shonky linux
По теме: askubuntu.com/questions/35922/…
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

Ответы:

207

Если у вас есть возможность переименования, используйте:

find . -name "*.t1" -exec rename 's/\.t1$/.t2/' '{}' +

или иначе:

find . -name '*.t1' -exec rename .t1 .t2 {} +

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

find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' +
анубхава
источник
20
find . -name '*.t1' -exec rename .t1 .t2 {} +
Аарон Бленкуш,
2
(Моя версия renameне позволяет использовать выражение подстановки в стиле sed. Я должен любить Linux. Раньше мне приходилось устанавливать TotalCommander для Windows, чтобы делать подобные вещи.)
Аарон Бленкуш,
6
На случай, если кому-то интересно, что "${1%.t1}".t2делает эта часть, как это сделал я: она использует манипуляции со строкой bash, чтобы сделать следующее: 1 / Возьмите первый позиционный параметр $1и усеките .t1строковый литерал с его конца ( %оператор знака процента ). 2 / Добавьте .t2строковый литерал к результату.
Zack
2
Переименование не сработало для меня в OSX, но версия bash потрясающая b / c Я просто добавил 'git' перед mv, и теперь git счастлив :-D
bdombro
3
предпочитают пользователя , find . -type f -name '*.t1'чтобы избежать папок
Golak саранги
8

Если ваша версия bashподдерживает эту globstarопцию (версия 4 или новее):

shopt -s globstar
for f in **/*.t1; do
    mv "$f" "${f%.t1}.t2"
done 
Чепнер
источник
7

Или вы можете просто установить mmvкоманду и сделать:

mmv '*.t1' '#1.t2'

Вот #1первая часть шара, то есть *in *.t1.

Или в чистом bash, простой способ:

for f in *.t1; do
    mv "$f" "${i%.t1}.t2"
done

(т. е .: forможет выводить список файлов без помощи внешней команды, такой как lsили find)

HTH

Zmo
источник
7
Я предполагаю, что использование OP «рекурсивно» относится также к переименованию файлов в подкаталогах каталога.
chepner
Извините, но что означает №1?
inafalcao 02
1
это первая часть **.t1
шара,
рекурсивно: $ mmv -n ';*.t1' '#1#2.t2'. снять -nфлаг для выполнения
оклив
5

Я бы сделал это в bash:

for i in $(ls *.t1); 
do
    mv "$i" "${i%.t1}.t2" 
done

EDIT: моя ошибка: это не рекурсивно, вот мой способ рекурсивного изменения имени файла:

for i in $(find `pwd` -name "*.t1"); 
do 
    mv "$i" "${i%.t1}.t2"
done
jrjc
источник
8
Не разбирайте ls и посмотрите на той же странице, почему ваш findсинтаксис плохой. Также убедитесь, что вы указали свои переменные
Восстановите Монику, пожалуйста,
2
Спасибо, не знал.
jrjc