Переименуйте группу файлов с помощью одной команды

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

mv *.htm *.html 

не работает.

  • Используя команду history с помощью ssh и получать выходные данные с отметками времени
  • Какую команду мне нужно использовать для удаления файла с именем `-rf`?
  • Есть ли способ отображения таймера обратного отсчета или секундомера в терминале?
  • Как я могу заставить chown работать рекурсивно?
  • Использование терминала Linux / Unix для копирования многих файлов в новое место
  • Что происходит с запущенными процессами, когда я теряю удаленное соединение с полем * nix?
  • Как я могу перечислить разрешения каждого компонента в пути к файлу?
  • Что означает @ in ls -al?
  • 8 Solutions collect form web for “Переименуйте группу файлов с помощью одной команды”

    Или, вы могли бы использовать чистый bash … (за исключением mv, то есть ..)

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

    И избегайте неприятного базового материала. 😉

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

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

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

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

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

     for file in *.htm do mv "$file" "${file}l" done 

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

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

    Или если вы также используете вспомогательные каталоги

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

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

     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 знает, как обрабатывать более двух аргументов, если последний является каталогом.

    Еще один пример чистого bash, использующий строку replace.

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

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

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

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

    Лучший инструмент – mmv .

     mmv \*.htm #1.html 

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

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

     rename .htm .html *.html 
    Давайте будем гением компьютера.