Я хочу , чтобы рекурсивно итерацию через каталог и изменить расширение всех файлов определенного расширения, скажем , .t1к .t2. Что для этого используется команда bash?
(Моя версия 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
Ответы:
Если у вас есть возможность переименования, используйте:
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' - '{}' +
источник
find . -name '*.t1' -exec rename .t1 .t2 {} +
rename
не позволяет использовать выражение подстановки в стиле sed. Я должен любить Linux. Раньше мне приходилось устанавливать TotalCommander для Windows, чтобы делать подобные вещи.)"${1%.t1}".t2
делает эта часть, как это сделал я: она использует манипуляции со строкой bash, чтобы сделать следующее: 1 / Возьмите первый позиционный параметр$1
и усеките.t1
строковый литерал с его конца (%
оператор знака процента ). 2 / Добавьте.t2
строковый литерал к результату.find . -type f -name '*.t1'
чтобы избежать папокЕсли ваша версия
bash
поддерживает этуglobstar
опцию (версия 4 или новее):shopt -s globstar for f in **/*.t1; do mv "$f" "${f%.t1}.t2" done
источник
Или вы можете просто установить
mmv
команду и сделать:mmv '*.t1' '#1.t2'
Вот
#1
первая часть шара, то есть*
in*.t1
.Или в чистом bash, простой способ:
for f in *.t1; do mv "$f" "${i%.t1}.t2" done
(т. е .:
for
может выводить список файлов без помощи внешней команды, такой какls
илиfind
)HTH
источник
*
*.t1
$ mmv -n ';*.t1' '#1#2.t2'
. снять-n
флаг для выполненияЯ бы сделал это в 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
источник
find
синтаксис плохой. Также убедитесь, что вы указали свои переменные