bir karakter veya dizeyi kaldırarak birden fazla dosyayı nasıl yeniden adlandırabilirim?


21

Benim için bir devamı olarak önceki soruya , ben formun birden fazla dosya varsa

sw.ras.001
sw.ras.002
sw.ras.003
…

ras.Tüm dosyaların ortasında kaldırmak için hangi komutu kullanabilirim ?


Eğer kaldırmak istiyor musunuz sadeceras , yani ile bitirmek sw..001veya ras., ayrılma sw.001?
Kevin

Muhtemelen 'ras' kaldırmak istiyorum. emir çok farklı mı olurdu?
Paul

Hayır, sadece \.kalıplara dahil edip etmediğiniz .
Kevin

Yanıtlar:


35

Bunu, son sorudan herhangi birindeki cevabın oldukça küçük bir modifikasyonuyla yapabilirsiniz:

rename s/ras\.// sw.ras.*

veya

for file in sw.ras.*; do
    mv "$file" "${file/ras./}"
done

Açıklama:

renamedüzenli bir ifade ve dosya listesi alan bir perlkomut perldosyasıdır, sırayla her dosyanın adına regex uygular ve her dosyayı, regex uygulamasının sonucu olarak yeniden adlandırır. Bizim durumumuzda, raskelimenin tam anlamıyla \.eşleşir ve bir değişmezle eşleşir .( .tek başına yeni satır dışında herhangi bir karakteri belirtir) ve bunu hiçbir şey olmadan değiştirir.

forDöngü tüm ile başlayan dosyaları alır sw.ras.üzerlerinden (standart kabuk glob) ve döngüler. ${var/search/replace}aramalar $variçin searchve yerine geçer ilk geçtiği replace, böylece ${file/ras./}döner $fileilk önce ras.çıkarılır. Böylece komut, dosyayı aynı eksi adıyla yeniden adlandırır ras.. Bu arama ve değiştirme ile .tam anlamıyla özel bir karakter olarak alınmadığına dikkat edin.


Cevabınızı, başkalarından öğrenenlere açıklayabilir misiniz? "S / ras \ .// sw.ras. *" Ne işe yarıyor? Sanırım biliyorum ama emin olmak istiyorum ve diğerleri de öğrenebilir. İkinci seçenek aynı şekilde.
H_7

1
@ H_7 İyi fikir, bir açıklama ekledim.
Kevin

14

Başka bir seçenek mmv kullanmaktır (Mass MoVe ve yeniden adlandır):

mmv '*ras.*' '#1#2'

Desenlerinizin etrafındaki tek tırnak işaretlerini kullanmayı unutmayın, aksi takdirde yıldızlar kabuk düzeyinde genişler.

Yardımcı program her zaman kullanılamaz, ancak yoksa, ile yükleyebilirsiniz:

sudo apt-get install mmv

Buradaki man sayfasına bakın .


1
Bu harika bir araç !!!
Christian,

5

Herhangi bir POSIX uyumlu kabuk (in bash, dash, ksh, vs.):

for file in sw.ras.[[:digit:]][[:digit:]][[:digit:]]; do
    mv "${file}" "${file/ras\./}"
done

Veya rename:

rename 's/ras\.//' sw.ras.[[:digit:]][[:digit:]][[:digit:]]

1

Geçenlerde, bir karakterin dosya isimlerinde birçok defa meydana geldiği bir karakterin son oluşumunu değiştirmek zorunda kaldığım birtakım dosyaların bir kısmını yeniden adlandırmam gerekti. Bu özel durumda ben geçen çizgi yerine vardı -bir alt çizgi ile _bu dönüm,:

some-long-file-name.ext

bunun içine:

some-long-file_name.ext

Biraz zaman aldı ama bu sonunda yaptı:

for FILE in *; do mv $FILE ${FILE%-*}_${FILE##*-}; done

İşte:

  • ${i%-*} dosya adının başlangıcını, en son tire satırına kadar eşleştirir. -
  • ${file##*-} Son işlemden sonra dosya adının kalanıyla eşleşir. -
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.