Как переименовать расширение для группы файлов? - PullRequest
430 голосов
/ 04 августа 2009

В каталоге у меня есть куча *.html файлов. Я хотел бы переименовать их всех в *.txt

Как я могу это сделать? Я использую оболочку bash.

Ответы [ 20 ]

616 голосов
/ 04 августа 2009

Если вы используете bash, вам не нужны внешние команды, такие как sed, basename, rename, expr и т. Д.

for file in *.html
do
  mv "$file" "${file%.html}.txt"
done
345 голосов
/ 04 августа 2009

Для лучшего решения (с использованием только функций bash, в отличие от внешних вызовов) см. один из ответов .


Следующее действие будет выполнять и не требует, чтобы в системе была установлена ​​программа rename (хотя это наиболее часто встречается в системе):

for file in *.html; do
    mv "$file" "$(basename "$file" .html).txt"
done

РЕДАКТИРОВАТЬ: Как указано в комментариях, это не работает для имен файлов с пробелами в них без надлежащего цитирования (теперь добавлено выше). Когда вы работаете исключительно с вашими собственными файлами, у которых, как вы знаете, нет пробелов в именах файлов, это будет работать, но всякий раз, когда вы пишете что-то, что может быть использовано позже, не пропускайте правильное цитирование.

179 голосов
/ 04 августа 2009
rename 's/\.html$/\.txt/' *.html

делает именно то, что вы хотите.

88 голосов
/ 04 декабря 2014

Это работало для меня на OSX от .txt до .txt_bak

find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;
87 голосов
/ 04 августа 2009

Вы хотите использовать rename:

rename -S .html .txt *.html

Это именно то, что вы хотите - оно изменит расширение с .html на .txt для всех файлов, соответствующих *.html.

Примечание: Грег Хьюгилл правильно указывает на то, что это не встроенный bash; и это отдельная команда Linux. Если вам просто нужно что-то в Linux, это должно работать нормально; если вам нужно что-то более кроссплатформенное, взгляните на один из других ответов.

33 голосов
/ 23 июля 2015

на Mac ...

  1. Установить переименовать , если у вас нет: brew install rename
  2. rename -S .html .txt *.html
15 голосов
/ 27 февраля 2015

Для пользователей Ubuntu:

rename 's/\.html$/\.txt/' *.html
7 голосов
/ 28 сентября 2014

Вот пример команды переименования:

rename -n ’s/\.htm$/\.html/’ *.htm

-n означает, что это тестовый запуск, и он фактически не изменит никаких файлов. Он покажет вам список файлов, которые будут переименованы, если вы удалите -n. В приведенном выше случае он преобразует все файлы в текущем каталоге с расширением .htm в .html.

Если результат вышеприведенного теста выглядел нормально, вы можете запустить финальную версию:

rename -v ’s/\.htm$/\.html/’ *.htm

Опция -v является необязательной, но рекомендуется включить ее, поскольку она является единственной записью изменений, которые были внесены командой переименования, как показано в примере вывода ниже:

$ rename -v 's/\.htm$/\.html/' *.htm
3.htm renamed as 3.html
4.htm renamed as 4.html
5.htm renamed as 5.html

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

rename -v ’s/\.htm$/\.html/’ *.htm
5 голосов
/ 21 сентября 2018

Это самое приятное решение, которое я нашел, которое работает на OSX и Linux, и оно прекрасно работает и с git!

find . -name "*.js" -exec bash -c 'mv "$1" "${1%.js}".tsx' - '{}' \;

и с мерзавцем:

find . -name "*.js" -exec bash -c 'git mv "$1" "${1%.js}".tsx' - '{}' \;

5 голосов
/ 20 июня 2017

В этом вопросе явно упоминается Bash, но если у вас есть ZSH, это довольно просто:

zmv '(*).*' '$1.txt'

Если вы получаете zsh: command not found: zmv, просто запустите:

autoload -U zmv

А затем попробуйте снова.

Благодаря этой оригинальной статье за отзыв о zmv.

...