Dizindeki tüm dosyaları $ filename_h yerine $ filename_half?


139

Ölü basit.

Nasıl yeniden adlandırabilirim

05_h.png
06_h.png

için

05_half.png
06_half.png

En azından, bence basit, ama zaten bilmiyorsanız bu tür şeyler için Google için zor.

Teşekkürler....

Yanıtlar:


302

Sadece bash kullanın, harici komutları çağırmanıza gerek yok.

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

Ekleme #!/bin/sh

Bu tek astara ihtiyaç duyanlar için:

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

7
Sed yerine yerleşik dahili dize değişiminin güzel kullanımı
12'de

3
/ _h.png / _half.png regex dosyası nedir?
user2799603

15
Hayır, biçim şu şekildedir: $ {string / substring / substitution} - "yedek ilk olay". Daha fazla bilgi için bu hile sayfasını kontrol edin ("dizeler" bölümü): bruxy.regnet.cz/linux/bash_cheatsheet/bash_cheatsheet.pdf
WindRider

11
Herhangi bir nedeni var Do not add #!/bin/shmı? Bu ifadeyle birlikte / bu deyim olmadan çalışmayı denedim.
Ryan

6
@Ryan @Ishan Jain Aslında senaryoyu yürütmesi gereken arka uç kabuğunu gösterir. sh ve bash farklı kabuklardır, böylece kod davranışını ve sözdizimini etkileyebilir. Komut dosyası bir bash yerleşik dize değiştirme kullandığından, üstbilgiyi eklemeniz gerekir #!/bin/bash. Bununla birlikte, bash normalde birçok bilgisayarda varsayılan kabuktur, bu yüzden çok fazla fark bulamazsınız: D Burada
Cristian Ramon-Cortes

65

renameKomutu dene :

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

Güncelleme:

örnek kullanım:

biraz içerik oluştur

$ 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

test çözümü:

$ rename 's/_h.png/_half.png/' *.png
$ ls
one_half.png  three_half.png  two_half.png

1
@CarolineAlexiou: Örnek test oturumu ekledim. Lütfen dene. Muhtemelen bazı yazım hatalarınız var. Çıktısı nedir ls? ne rename ...deniyorsun
Michał Šrajer

2
Mac'te bash'de çalışmıyor, fwiw. renamestandart bir Unix aracı değildir.
tandrewnichols

1
@tandrewnichols, homebrew'u deneyin - kurulduktan sonra, yeniden adlandırma ile saniyeler içinde kullanılabilir hale gelirbrew install rename
Simbamangu

4
benim için 's//'rename [options] expression replacement file...rename from util-linux 2.23.2
gelince

2
.sadece bir nokta ile değil HERHANGİ bir karakterle eşleştiğini unutmayın - gerçek nokta için, \.bunun yerine kullanın
Meisner

11
for f in *.png; do
  fnew=`echo $f | sed 's/_h.png/_half.png/'`
  mv $f $fnew
done

1
Önceden kuru çalışma yapmak için harikadır. İlk değiştirilir mv $f $fnewile echo $fnewikinci hat çıkışı görünüyor aklı başında emin olmak için.
lobati

10

Saf bir bash çözümü mü arıyorsunuz? Birçok yaklaşım var, ama burada bir tane var.

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

Bu, geçerli dizinde sona eren dosyaların _h.pngyeniden adlandırmak istediğiniz dosyalar olduğunu varsayar .

Çok daha spesifik olarak

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

Bu iki örneği varsayalım sadece sizin. Dosyalar.

Genel durumda, dosya içinde yeniden adlandırma etti edilmiş örtülü önce .


6

renamePerl ile yazılmış yardımcı programı kullanın . Gerçi varsayılan olarak mevcut olmayabilir ...

$ 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

4

Benzer bir sorum vardı: Kılavuzda, yeniden adlandırma

rename [option] expression replacement file

böylece bu şekilde kullanabilirsiniz

rename _h _half *.png

Kodda: '_h' aradığınız ifadedir. '_half' ile değiştirmek istediğiniz kalıptır. '* .png' olası hedef dosyalarınızı aradığınız dosya aralığıdır.

Umarım bu yardımcı olabilir:


1

Başka bir yaklaşım, toplu yeniden adlandırma seçeneği kullanılarak el ile olabilir

Dosyaya sağ tıklayın -> Dosya Özel Komutları -> Toplu Yeniden Adlandır ve h'yi değiştirebilirsiniz. yarısı ile.

Bu WinSCP vb kullanarak linux tabanlı gui için çalışacaktır


0

renameYardımcı programı kullanın :

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

Bir astar:
for file in *.php ; do mv "$file" "_$file" ; done


0

Yanıt seti tamamlanmış olsa da , eksik bir tane daha eklemem gerekiyor.

for i in *_h.png;
  do name=`echo "$i" | cut -d'_' -f1`
  echo "Executing of name $name" 
  mv "$i" "${name}_half.png"
done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.