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


87

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


14
imho, це не дубльоване запитання - інше питання не є рекурсивним
shonky linux user

Відповіді:


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рядковий літерал до результату.
Зак,

2
Перейменування не працювало для мене в OSX, але версія bash є чудовою b / c, я просто додав 'git' перед mv, і тепер git щасливий :-D
bdombro

3
віддають перевагу користувачеві find . -type f -name '*.t1'уникати папок
Golak Sarangi

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.

Або в чисто баш-речах простим способом буде:

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

(тобто: forможе перераховувати файли без допомоги зовнішньої команди, наприклад, lsабоfind )

HTH


7
Я припускаю, що використання OP "рекурсивно" стосується і перейменування файлів у підкаталогах каталогу.
чепнер

Вибачте, але що означає # 1?
inafalcao 02

1
це перша глобусова частина, тобто *in*.t1
zmo

рекурсивно: $ mmv -n ';*.t1' '#1#2.t2'. зняти -nпрапор для виконання
okliv

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.