Просто ради полноты, ren *.htm *.htmlбудем работать в Windows.
Брайан Бернс
Ответы:
50
Или вы можете использовать чистый bash ... (кроме mv, то есть ..)
for file in*.htm;do mv "$file""${file%.htm}.html";done
и избегать неприятных базовых имен. ;)
Bash имеет обширный набор параметров расширения переменных. Используемый здесь «%» удаляет наименьший соответствующий суффикс из значения переменной. Шаблон является шаблоном глобуса, поэтому ${file%.*}также будет работать. Оператор '%%' удаляет самый большой соответствующий суффикс и является взаимозаменяемым в приведенном выше примере, так как шаблон является фиксированным, ${file%%.*}.htmlхотя превратит abhtm в a.html.
См. Раздел с подстановкой переменных на man-странице bash для более изящных приемов. В bash можно многое сделать напрямую.
Также обратите внимание, что эти расширения параметров не ограничиваются bash . Они доступны для всех оболочек, полученных из Bourne ( sh , ksh , bash , zsh , dash , ash и т. Д.). Расширения являются частью спецификации POSIX для «Shell Command Language» и легко переносимы.
Крис Джонсен
11
В именах файлов не должно быть пробелов, символов новой строки или других пробелов, но эта версия ответа freiheit обрабатывает их. Он также использует $()вместо обратных галочек для удобочитаемости наряду с другими преимуществами.
for file in*.htm
do
mv "$file""$(basename "$file" .htm).html"done
Еще лучше - для особого случая просто добавить в конец:
for file in*.htm
do
mv "$file""${file}l"done
Приостановлено до дальнейшего уведомления. источник
11
rename(1)утилита Perl, которая делает именно то, что вы хотите В этом случае:
rename 's/\.htm$/.html/' *htm
или если вы используете подкаталоги, а также
(требуется Bash 4.0 и настройки globstar: shopt -s globstar)
переименовать проще, но это не стандартная программа unix; Оригинальный вопрос не указывает, какой Unix. Кажется, в некоторых местах "prename".
Freiheit
2
renameпоставляется с Perl, и в основном каждый Unix поставляется с Perl в наши дни.
TRS-80
3
да, но не каждый Unix включает вспомогательные программы, такие как «переименование», когда они помещают Perl в систему. OSX, например, не имеет «переименовать» на нем.
Freiheit
1
@William: Синтаксис двойной звездочки доступен только в Bash 4 и выше и только если он включен с shopt -s globstar(по умолчанию выключен). Кроме того, в Linux и Unix есть каталоги, а не папки.
Приостановлено до дальнейшего уведомления.
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 знает, как обрабатывать более двух аргументов, если последний является каталогом.
Вы должны заключить в кавычки "$ file", чтобы обработать пробелы.
Ричард Хоскинс
Ваше описание исходной проблемы должно быть подчеркнуто сильнее. Такое поведение с подстановочными знаками оболочки удивительно и не интуитивно понятно для кого-то из Windows, и понимание того, что делает оболочка, дает понять, почему оригинальное приложение 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
Ваш пример использования не удался. Вам нужно сбежать #.
Кристиан Чупиту
Нет, это работает (я ВСЕГДА проверяю перед публикацией в SuperUser). Необходимость экранирования # зависит от используемой вами оболочки (я использую zsh).
bortzmeyer 13.09.09
0
Пакет util-linux-ng (в Fedora) имеет renameкоманду, аналогичную команде, упомянутой в TRS-80 . Вы можете использовать это так:
ren *.htm *.html
будем работать в Windows.Ответы:
Или вы можете использовать чистый bash ... (кроме mv, то есть ..)
и избегать неприятных базовых имен. ;)
Bash имеет обширный набор параметров расширения переменных. Используемый здесь «%» удаляет наименьший соответствующий суффикс из значения переменной. Шаблон является шаблоном глобуса, поэтому
${file%.*}
также будет работать. Оператор '%%' удаляет самый большой соответствующий суффикс и является взаимозаменяемым в приведенном выше примере, так как шаблон является фиксированным,${file%%.*}.html
хотя превратит abhtm в a.html.См. Раздел с подстановкой переменных на man-странице bash для более изящных приемов. В bash можно многое сделать напрямую.
источник
В именах файлов не должно быть пробелов, символов новой строки или других пробелов, но эта версия ответа freiheit обрабатывает их. Он также использует
$()
вместо обратных галочек для удобочитаемости наряду с другими преимуществами.Еще лучше - для особого случая просто добавить в конец:
источник
rename(1)
утилита Perl, которая делает именно то, что вы хотите В этом случае:rename 's/\.htm$/.html/' *htm
или если вы используете подкаталоги, а также
(требуется Bash 4.0 и настройки globstar:
shopt -s globstar
)rename 's/\.htm$/.html/' **/*htm
источник
rename
поставляется с Perl, и в основном каждый Unix поставляется с Perl в наши дни.shopt -s globstar
(по умолчанию выключен). Кроме того, в Linux и Unix есть каталоги, а не папки.Попробуйте это
echo
передmv
первым разом.Проблема с вашим оригиналом заключается в том, что "
mv *.htm *.html
"*
обрабатывает s с помощью оболочки, поэтомуmv
команда просто видит список всех файлов .htm и .html в текущем каталоге. Другими словами, что-то вроде "mv foo.htm bar.htm stuff.htm six.htm file.htm
". mv знает, как обрабатывать более двух аргументов, если последний является каталогом.источник
mv
не будет работать.Еще один пример чистого bash с использованием string replace.
Extra - это заменяет все вхождения строки
источник
Если вы используете Zsh, вы можете использовать 'ZMV'
источник
Лучший инструмент - ммв .
Другие примеры использования (и других инструментов) в « Сводке инструментов командной строки GNU / Linux ».
источник
#
.Пакет util-linux-ng (в Fedora) имеет
rename
команду, аналогичную команде, упомянутой в TRS-80 . Вы можете использовать это так:источник