38

Если у меня есть группа файлов с расширением .htm, как я могу переименовать их все в .html?

mv *.htm *.html

не работает.

8 ответов8

50

Или вы можете использовать чистый bash ... (кроме mv, то есть ..)

for file in *.htm; do mv "$file" "${file%.htm}.html"; done

и избегать неприятных базовых вещей. ;)

Bash имеет обширный набор параметров расширения переменных. Используемый здесь «%» удаляет наименьший соответствующий суффикс из значения переменной. Шаблон является шаблоном глобуса, поэтому ${file%.*} Также будет работать. Оператор '%%' удаляет самый большой совпадающий суффикс и является взаимозаменяемым в приведенном выше примере, так как шаблон фиксированный, ${file%%.*}.html превратил бы abhtm в a.html.

Посмотрите раздел подстановки переменных на man-странице bash для более изящных приемов. В bash можно многое сделать напрямую.

11

rename(1) - это утилита Perl, которая делает именно то, что вы хотите. В этом случае:

rename 's/\.htm$/.html/' *htm

или если вы используете подкаталоги, а также

(требуется Bash 4.0 и настройка globstar : shopt -s globstar)

rename 's/\.htm$/.html/' **/*htm

11

В именах файлов не должно быть пробелов, символов новой строки или других пробелов, но эта версия ответа freiheit обрабатывает их. Он также использует $() вместо обратных кавычек для удобства чтения наряду с другими преимуществами.

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

Еще лучше - для особого случая просто добавить в конец:

for file in *.htm
do
    mv "$file" "${file}l"
done
6
for file in *.htm; do
  mv $file `basename "$file" .htm`.html
done

Попробуйте это с echo перед mv первый раз.

Проблема с вашим оригиналом в том, что « mv *.htm *.html » имеет * s, обрабатываемые оболочкой, поэтому команда mv просто видит список всех файлов .htm и .html в текущем каталоге. Другими словами, что-то вроде « mv foo.htm bar.htm stuff.htm six.htm file.htm ». mv знает, как обрабатывать более двух аргументов, если последний является каталогом.

3

Еще один пример чистого bash с использованием string replace.

for file in *.htm; do mv $file ${file/htm/html}; done

Extra - это заменяет все вхождения строки

for file in *.htm; do mv $file ${file//htm/html}; done
1

Если вы используете Zsh, вы можете использовать 'ZMV'

1

Лучший инструмент - ммв.

mmv \*.htm #1.html

Другие примеры использования (и других инструментов) в « Сводке инструментов командной строки GNU/Linux ».

0

Пакет util-linux-ng (в Fedora) имеет команду rename аналогичную той, которая упоминалась в TRS-80. Вы можете использовать это так:

rename .htm .html *.html

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .