Перейменувати всі файли в каталозі з $ filename_h в $ filename_half?


139

Мертвий простий.

Як мені перейменувати

05_h.png
06_h.png

до

05_half.png
06_half.png

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

Дякую....

Відповіді:


302

Просто використовуйте 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
це файл / _h.png / _half.png regex?
користувач2799603

15
Ні, формат такий: $ {string / substring / substitution} - "заміна першого появи". Для отримання додаткової інформації перевірте цей шпаргалку (розділ "рядки"): 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 - це звичайно оболонка за замовчуванням у багатьох комп’ютерах, тому ви не знайдете багато відмінностей: D Ви можете знайти більше інформації тут
Cristian Ramon-Cortes

65

Спробуйте 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
Не працює в баш на Mac, fwiw. renameне є стандартним інструментом Unix.
tandrewnichols

1
@tandrewnichols, випробуйте домашню мову - після встановлення перейменування стане доступним за лічені секунди зbrew install rename
Simbamangu

4
як на мене перейменування не спрацювало 's//'- я посилався на людину і був простий конспект:, rename [options] expression replacement file...на CentOS 7, версія:rename from util-linux 2.23.2
tymik

2
майте на увазі, що .відповідає БУДЬ-який символ, а не лише крапка - для буквальної крапки використовуйте \.натомість
Майснер

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як друга лінія впевнена зробити висновок виглядає здоровою.
lobati

10

Шукаєте чистого рішення? Є багато підходів, але ось один.

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утиліту, написану на перл. Можливо, це не доступно за замовчуванням, хоча ...

$ 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

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

rename [option] expression replacement file

тож ви можете використовувати його таким чином

rename _h _half *.png

У коді: '_h' - це вираз, який ви шукаєте. '_half' - це шаблон, який ви хочете замінити. '* .png' - це діапазон файлів, які ви шукаєте для можливих цільових файлів.

Сподіваюся, що це може допомогти c:


1

Інший підхід може бути вручну, використовуючи опцію пакетного перейменування

Клацніть правою кнопкою миші на файл -> Файл користувацьких команд -> Перейменування партії, і ви можете замінити h. з половиною.

Це буде працювати для Linux на основі gui, використовуючи 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 i in *_h.png;
  do name=`echo "$i" | cut -d'_' -f1`
  echo "Executing of name $name" 
  mv "$i" "${name}_half.png"
done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.