Переименовать все файлы в каталоге с $ filename_h на $ filename_half?

146

Мертвая простота.

Как мне переименовать

05_h.png
06_h.png

к

05_half.png
06_half.png

По крайней мере, я думаю, что это просто, но в Google сложно делать подобные вещи, если вы еще не знаете.

Благодарность....

Ричард
источник

Ответы:

312

Просто используйте bash, не нужно вызывать внешние команды.

for file in *_h.png
do
  mv "$file" "${file/_h.png/_half.png}"
done

Не добавляйте #!/bin/sh

Для тех, кому нужен однострочный:

for file in *.png; do mv "$file" "${file/_h.png/_half.png}"; done
баш-о-логист
источник
7
Хорошее использование встроенной замены строк в bash, а не в sed
dandrews
3
такое регулярное выражение file / _h.png / _half.png?
user2799603
15
Нет, формат такой: $ {строка / подстрока / подстановка} - «заменить первое вхождение». Для получения дополнительной информации ознакомьтесь с этой шпаргалкой (раздел "строки"): bruxy.regnet.cz/linux/bash_cheatsheet/bash_cheatsheet.pdf
WindRider
11
Какие-нибудь причины Do not add #!/bin/sh? Я пробовал работать как с этим утверждением, так и без него.
Райан
6
@Ryan @Ishan Jain Фактически, это указывает на внутреннюю оболочку, которая должна выполнить сценарий. sh и bash - это разные оболочки, поэтому они могут повлиять на поведение и синтаксис скрипта. Поскольку в сценарии используется встроенная замена строки bash, вам следует добавить заголовок #!/bin/bash. При этом bash обычно является оболочкой по умолчанию на многих компьютерах, поэтому вы не найдете
Кристиан Рамон-Кортес,
67

Попробуйте renameкоманду:

rename 's/_h.png/_half.png/' *.png

Обновить:

пример использования:

создать контент

$ mkdir /tmp/foo
$ cd /tmp/foo
$ touch one_h.png two_h.png three_h.png
$ ls 
one_h.png  three_h.png  two_h.png

тестовое решение:

$ rename 's/_h.png/_half.png/' *.png
$ ls
one_half.png  three_half.png  two_half.png
Михал Шрайер
источник
1
@CarolineAlexiou: Я добавил пример тестовой сессии. Пожалуйста, попробуйте. Вероятно, у вас есть опечатка. Что на выходе ls? что rename ...вы пытаетесь?
Michał Šrajer
2
Не работает в bash на Mac, черт возьми. renameне является стандартным инструментом Unix.
tandrewnichols 09
1
@tandrewnichols, попробуйте homebrew - после установки переименование становится доступным в считанные секунды сbrew install rename
Simbamangu
4
что касается меня, переименование не сработало 's//'- я сослался на человека, и там был простой синопсис:, rename [options] expression replacement file...на CentOS 7, версия:rename from util-linux 2.23.2
tymik
2
имейте в виду, что .соответствует ЛЮБОЙ символ, а не только точка - \.вместо буквальной точки используйте
Meisner
11
for f in *.png; do
  fnew=`echo $f | sed 's/_h.png/_half.png/'`
  mv $f $fnew
done
Кароли Хорват
источник
1
Это отлично подходит для предварительного пробного прогона. Я первый заменен mv $f $fnewс echo $fnewкак вторая линия уверена сделать вывод выглядит здоровой.
лобати
10

Вы ищете чистое решение для bash? Подходов много, но вот один.

for file in *_h.png ; do mv "$file" "${file%%_h.png}_half.png" ; done

Это предполагает, что единственные файлы в текущем каталоге, заканчивающиеся _h.pngна те, которые вы хотите переименовать.

Гораздо более конкретно

for file in 0{5..6}_h.png ; do mv "$file" "${file/_h./_half.}" ; done

Предполагая, что эти два примера - ваши единственные. файлы.

В общем случае, переименование файлов в уже было охвачено до того .

сорпигаль
источник
6

Воспользуйтесь renameутилитой, написанной на perl. Может быть, он недоступен по умолчанию ...

$ touch 0{5..6}_h.png

$ ls
05_h.png  06_h.png

$ rename 's/h/half/' *.png

$ ls
05_half.png  06_half.png
Фредрик Пиль
источник
4
for i in *_h.png ; do
  mv $i `echo "$i"|awk -F'.' '{print $1"alf."$2}'`
done
ztank1013
источник
4

У меня был аналогичный вопрос: в руководстве описывается переименование как

rename [option] expression replacement file

так что вы можете использовать это таким образом

rename _h _half *.png

В коде: '_h' - это выражение, которое вы ищете. '_half' - это шаблон, которым вы хотите заменить. '* .png' - это диапазон файлов, которые вы ищете в качестве возможных целевых файлов.

Надеюсь, это поможет c:

Джеймс Йен
источник
1

Другой подход может заключаться в ручном использовании опции пакетного переименования.

Щелкните правой кнопкой мыши файл -> Пользовательские команды файла -> Пакетное переименование, и вы можете заменить h. с половиной.

Это будет работать для графического интерфейса на основе Linux с использованием WinSCP и т. Д.

Ишвар
источник
0

Воспользуйтесь renameутилитой:

rc@bvm3:/tmp/foo $ touch 05_h.png 06_h.png
rc@bvm3:/tmp/foo $ rename 's/_h/_half/' * 
rc@bvm3:/tmp/foo $ ls -l
total 0
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 05_half.png
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 06_half.png
К. Рэмсиер
источник
0

Один лайнер:
for file in *.php ; do mv "$file" "_$file" ; done

Jadeye
источник
0

Хотя набор ответов полный, мне нужно добавить еще один отсутствующий.

for i in *_h.png;
  do name=`echo "$i" | cut -d'_' -f1`
  echo "Executing of name $name" 
  mv "$i" "${name}_half.png"
done
Таринду Сатишандра
источник