Desen tabanlı, toplu iş dosyası terminalde yeniden adlandır


48

Aşağıdakileri yeniden adlandırmam gerekiyor:

file_001_loremipsum.png
file_002_dolor.png
file_003_sit.png
file_004_amet.png
file_105_randomness.png

içine

upl_loremipsum.png
upl_dolor.png
upl_sit.png
upl_amet.png
upl_randomness.png

Sadece basit bir terminal komut satırı ile gerçekleşmesini nasıl sağlayabilirim?


1
Tüm alt klasörlerde özyinelemeli çalışan, güvenli olmayan regex tabanlı bir python sürümü: stackoverflow.com/a/39698169/191246
— ccpizza

Yanıtlar:


79

Rename kullanarak yukarıdaki örneğe çözüm :

rename -v -n 's/file_\d{1,3}/upl/' file_*.png

Kullanımı:

rename [options] [Perl regex search/replace expression] [files]

Kimden man rename:

   -v, --verbose
           Verbose: print names of files successfully renamed.
   -n, --no-act
           No Action: show what files would have been renamed.

MAY olarak adlandırın, argüman olarak regex alın.

Baktığımız şey, tek tırnak işaretleri arasındaki içerik '. Regex'i ayırarak yerleştirebilirsiniz /.

Formül: s/(1)/(2)/where (1)= arama kalıbı ve (2)= kalıbı değiştir.

Öyleyse kendinizi regex ile tanıştırın ve kalıp tabanlı toplu iş dosyası yeniden adlandırma keyfini çıkarın!


14
Bunun Ubuntu olduğunu biliyorum, ancak bir OS X çözümü arasa da birileri buraya gelirse ( renamekolayca yaptım) kolayca kurulabilir brew install rename.
— sandstrom

Ubuntu 18.10'da --no-actbayrak bunun --nonoyerine. Bu cevap biraz daha açık da olabilir: [files]mevcut dizinde, birinin potansiyel olarak yeniden adlandırmak istediği dosyaları eşleştiren ilk bir deseni ifade eder (örneğin, *her şeyi eşleştirir, ancak yalnızca geçerli dizinde).
— Patrick Dark

Bağlantınız rename, rename from to filedüzenli ifadeleri formatlayan ve desteklemeyen bir başkasını işaret ediyor . Aslında, Linux dağıtımım (Cent OS 7) tam olarak bu sürüme sahip.
— Alex Che,

6

dosyalar birkaç dizinde bulunuyorsa, şunu bulduktan sonra yeniden adlandır:

find -iname file_*.png -type f -exec rename -n 's/file_[0-9]{3}(.*\.png)/upl$1/' {} \;

-n yeniden adlandırdıktan sonra sınamak için, devam etmek için onu kaldırın! -)

Bunun gibi, gücü bulup yeniden adlandırırsınız.

Şahsen, kaynakları başlığını .h'den .hpp'ye yeniden adlandırmak için kullandım.

find -iname *.h -type f -exec rename 's/(.*\.)h/$1hpp/' {} \;

Belgeleri var -iname, -typeve -execbayraklar de manpages.ubuntu.com/manpages/bionic/man1/find.1.html#expression . ( find --helpbu komut için özellikle yardımcı olmaz.) TL; DR: -inamedesen örneğini ens duyarsız bir şekilde eşleştirir; -type f“normal dosyalar” ile eşleşir; ve -execbir ;(noktalı virgül) karakteriyle karşılaşana kadar bir ifade çalıştırır .
— Patrick Dark

5

Bu, bash parametresi genişlemesinin küçük büyüsü ile yapılabilir!

for f in file_[0-9]*_*; do mv $f upl_${f#file_[0-9]*_}; done

file_[0-9]*_*;- İlk desen, 'file_anynumber_' ile başlayan tüm dosyaları seçmek için kullanılır.
${f#file_[0-9]*_}İkinci desen file_[0-9]*_, bash 'dizini' file_anynumber_ 'öğesini kaldırmasını kaldırmasını söyleyen parametre genişletmesinde kullanılır.

Daha fazla bilgi için Parameter expansion:

man bash

Bunun regex değil, globs kullandığına, bu nedenle [0-9]*herhangi bir dize tarafından takip edilen bir rakamla eşleşeceğini unutmayın. Muhtemelen sadece rakamlarla eşleşmenin daha iyi bir yolu var, ama özlü bir şey düşünemiyorum.
— wjandrea

Ayrıca bu komutun tüm alt dizinlerde özyinelemeli çalışması için bir yol önerebilir misiniz?
— Francesco DM,
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.