MacOS Terminalinde Dosyaları Toplu Olarak Yeniden Adlandırma Nasıl Yapılır?


123

Şu adda bir dizi dosyaya sahip bir klasörüm var:

prefix_1234_567.png
prefix_abcd_efg.png

Bir alt çizgiyi ve ortadaki içeriği toplu olarak kaldırmak istiyorum , böylece çıktı şöyle olur:

prefix_567.png
prefix_efg.png

Alakalı ancak tam olarak açıklayıcı değil:


NSString ve NSMutableString'in aralık ve alt dize yöntemlerine bakın
Grady Player

1
Buna terminal olmayan çözümler düşündünüz mü? Bir Automator iş akışı, bu tür işlemleri kolaylıkla gerçekleştirebilir. Tüm dosyaları yeniden adlandırmak ve metni _*_boş bir metinle değiştirmek için bir automator iş akışı oluşturabilirsiniz .
Encryptic

i otomatikçisi Joker karakterler yapamadık düşünce
kidnim

Yanıtlar:


234

Özel durumunuzda aşağıdaki bashkomutu kullanabilirsiniz ( bashmacOS'ta varsayılan kabuktur):

for f in *.png; do echo mv "$f" "${f/_*_/_}"; done

Not: Dosya adlarınız ile başlamak bir şans varsa -, yer -- önlerinde [1]:
mv -- "$f" "${f/_*_/_}"

Not: bir kuru çalıştırma gerçekleştirmek için echobaşına eklenmiştir mv. Gerçek yeniden adlandırmayı gerçekleştirmek için bunu kaldırın.

Komut satırından çalıştırabilir veya bir komut dosyasında kullanabilirsiniz.

  • "${f/_*_/_}"bir bash parametre genişletme uygulamasıdır : (ilk) alt dize eşleme modeli _*_değişmez değer ile değiştirilir ve addan _orta simgeyi etkili bir şekilde keser.
  • Bunun _*_bir model olduğunu (genelleme için de kullanılan bir joker karakter ifadesi), normal bir ifade olmadığını (kalıplar hakkında bilgi edinmek, çalıştırmak man bashve aramak için Pattern Matching) unutmayın.

Dosyaları sık sık toplu olarak yeniden adlandırırsanız , Perl tabanlı renameyardımcı program gibi özel bir araç yüklemeyi düşünün . MacOS'ta, popüler paket yöneticisi Homebrew'i aşağıdaki gibi kullanarak kurabilirsiniz :

brew install rename

İşte üstteki komutun karşılığı rename:

rename -n -e 's/_.*_/_/'  *.png

Yine, bu komut bir kuru çalıştırma gerçekleştirir; -ngerçek yeniden adlandırma gerçekleştirmek için kaldırın .

  • Benzer bashçözümü s/.../.../gerçekleştirir metin ikame ama - aksine bashgerçek - düzenli ifadeler kullanılmıştır.

[1] Özel değişken amacı --çok kamu tarafından desteklenen, olarak ele alınması gerektiğini sonraki argümanlar sinyal için işlenen hatta eğer (değerler) nokta gibi seçenekleri nedeniyle ile başlayan -şekilde, Jacob C notlar.


3
harika cevap, mükemmel çalıştı. Ayrıca geri dönüp daha fazla açıklamak ve bunu tekrar edersem daha zarif bir çözüm sağlamak için düzenlediğiniz için de minnettarım. tekrar, çok teşekkürler, çok yardımcı oldu
kaçırın

4
Eşleşti değişiklik kullanırken bir örnek ( .*-> $1), örneğin isim ver Foo bar S01E01 biz baz.extiçin S01E01.ext:rename -n -e 's/.*(S[0-9]{2}E[0-9]{2}).*(\.[a-z]{2,4})/$1$2/' *
Steve Robbins

2
echoKuru çalışmalar için kullanma fikrini seviyorum . Bahşiş için teşekkürler!
James Wright

Sadece yapmanı tavsiye ederimbrew install rename
Chris Redford

98

Dosyaları yeniden adlandırmak için renameyardımcı programı kullanabilirsiniz :

brew install rename

Örneğin, geçerli dizindeki tüm dosya adlarındaki bir arama dizesini değiştirmek için:

rename -nvs searchword replaceword *

Değişiklikleri uygulamak için 'n' parametresini kaldırın.

Daha fazla bilgi: man rename


1
OS XGNU bash( x86_64-apple-darwin ) sürümleri yeniden adlandırma yardımcı programını içermez.
l'L'l

4
Teşekkürler, evet üzerinden yüklenmesi gerekiyorbrew install rename
David Thomas

2
Bu ipucu harika! Yazdım rename -vs GLYCOPHORIN GLYCC *ve şimdi otomatik olarak 450+ dosyayı yeniden adlandırıyor. Ve süper hızlı da.
Sander W. van der Laan

3
Mükemmel! Aslında şeyleri yeniden adlandırmadan ÖNCE "Neyin değişeceğini göster" bölümünü seviyorum!
Ben Duffin

3
Bir normal ifade de kullanabilirsiniz. yeniden adlandır 's / 123 / onetwothree / g' *
Bryan

12

Sed kullanabilirsiniz:

ls * | sed -e 'p;s@_.*_@_@g' | xargs -n2 mv

sonuç:

prefix_567.png prefix_efg.png

* önce kuru çalıştırma yapmak için mv, sonda ile değiştirinecho

Açıklama:

  • e: yalnızca 1 sed komutu için isteğe bağlı.
  • p: girdiyi sed olarak yazdırmak için, bu durumda herhangi bir yeniden adlandırmadan önce orijinal dosya adı olacaktır.
  • @: sed'i daha okunaklı hale getirmek için / karakterinin yerine geçer. Yani, sed s / search / replace / g yerine s @ search @ replace @ g kullanın
  • _. *: alt çizgi, gerçek '.' karakter sıfır veya daha fazla kez (normal ifadedeki HERHANGİ bir karakterin aksine)
  • -n2: mv'ye parametre olarak aktarılması gereken 2 çıkış olduğunu belirtir. Her bir giriş için , ls , bu sed komutu daha sonra mv tedarik edecek 2 çıktı üretecektir.

1
Akıllıca, biraz gizemli bir çözüm. Gömülü boşluklar içeren dosya adlarını da desteklemek için bunu daha genel hale getirmek daha da karmaşık hale gelir: ls * | xargs -I % bash -c 'echo mv "%" "$(sed 's@_.*_@_@' <<<"%")"'( echoyeniden adlandırmak için kaldırın ).
mklement0

2
Esrarlı? Bunu seviyorum!
Bilal Akil

7

Şuna benzeyen bir grup dosyam vardı: be90-01.png ve kısa çizgiyi alt çizgi olarak değiştirmem gerekiyordu. Bunu kullandım, bu da işe yaradı:

for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done

2

renamekomutunu kullanarak kurabilirsiniz brew. sadece yap brew install renameve kullan.


1

kullanma mmv

mmv '*_*_*' '#1_#3' *.png

önce yüklemeniz gerekir sudo apt-get install mmv.
αғsнιη

1
Bunun OS X olduğu göz önüne alındığında, doğru kurulum prosedürü brew install mmv.
buckaroo1177125

1

bunu dene

for i in *.png ; do mv "$i" "${i/remove_me*.png/.png}" ; done

İşte başka bir yol:

for file in Name*.png; do mv "$file" "01_$file"; 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.