Перейменуйте групу файлів однією командою


38

Якщо у мене є група файлів із розширенням .htm, як я можу перейменувати їх у .html?

mv *.htm *.html

не працює.


Просто задля повноти, 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.

Дивіться розділ змінної підстанції на сторінці bash для отримання більш акуратних прийомів. Є багато, що можна зробити безпосередньо в басі.


1
Також зауважте, що ці розширення параметрів не обмежуються bash . Вони доступні на всіх похідних Борна ( ш , кш , баш , зш , тире , зола тощо). Розширення є частиною специфікації POSIX для "Мова командної оболонки" і дуже портативні.
Кріс Джонсен

11

У файлах файлів не повинно бути пробілів, нових рядків чи інших пробілів, але ця версія відповіді фрейхейту обробляє їх. Він також використовує $()замість підказок для читабельності разом з іншими перевагами.

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)

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


1
перейменувати простіше, але це не стандартна програма Unix; оригінальне запитання не вказує, який саме Unix. Здається, в деяких місцях є "прейменом".
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 знає, як обробити більше ніж два аргументи, якщо останній - це каталог.


1
Вам слід вказати "$ файл", щоб обробити пробіли.
Річард Хоскінс

Ваш опис початкової проблеми слід підкреслити сильніше. Така поведінка розширення підстановки для оболонок дивовижна та не інтуїтивно зрозуміла для тих, хто приїжджає з землі Windows, а розуміння того, що оболонка робить, дає зрозуміти, чому оригінальна програма mvне працює.
Грег Х'югілл

3

Ще один чистий приклад bash з використанням рядкової заміни.

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

Додатково - це замінює всі входження рядка

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


1

Найкращий інструмент - ммв .

mmv \*.htm #1.html

Інші приклади використання (та інших інструментів) у " Резюме інструментів командного рядка GNU / Linux ".


1
Приклад використання не вдається. Вам потрібно втекти #.
Крістіан Цюпіту

Ні, це працює (Я ЗАВЖДИ тестую перед публікацією на SuperUser). Необхідність втечі # залежить від оболонки, яку ви використовуєте (я використовую zsh).
bortzmeyer

0

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

rename .htm .html *.html
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.