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


87

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


14
imho, это не повторяющийся вопрос - другой вопрос не рекурсивный
пользователь shonky linux

Ответы:


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


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

8
Не разбирайте ls и посмотрите на той же странице, почему ваш findсинтаксис плохой. Также убедитесь, что вы указали свои переменные
Восстановите Монику, пожалуйста,

2
Спасибо, не знал.
jrjc
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.