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.