Dosyaları tek satır komutuyla yeniden adlandırma


10

Bu dizini var ve dosyaları yeniden adlandırmak istiyorum:

===> ls -1 Der-vierte-Weise/
10 - 10 - Erkenntniss.ogg
1 - 01 - Hoffnung.ogg
11 - 11 - Wahrheit.ogg
12 - 12 - Dankbarkeit.ogg
13 - 13 - Kredits.ogg
2 - 02 - Familie.ogg
3 - 03 - Demut.ogg
4 - 04 - Freude.ogg
5 - 05 - Schoenheit.ogg
6 - 06 - Solidaritaet.ogg
7 - 07 - Entscheidung.ogg
8 - 08 - Hilfe.ogg
9 - 09 - Unterstuetzung.ogg

Sonuç şöyle görünmelidir:

===> ls -1 Der-vierte-Weise/
01 - Hoffnung.ogg
02 - Familie.ogg
...

Bunu ortak kabuk araçlarıyla çözmek istiyorum.


1
Bunu ortak kabuk araçlarıyla çözmek istiyorum. İyi bir sebebin olmadığını söylemiyorum, ama kendime "neden?" Son kez çözmek için çok benzer bir sorunum vardı, Bash'i hemen bir tarafa ittim ve Python'da çözdüm. Çok daha kolay (ama zaten Python, string yöntemleri, glob.glob ve os.rename'yi biliyordum - ve ayrıca boşlukları ve diğer garip karakterleri olan klasör adlarıyla dolu bir ağacı geri almak zorunda kaldım, hiçbiri ekstra bir neden değil Python kullanıyorsanız rahatsız edin)
nigel222 19:17

1
@ nigel222 Tembelim ve mümkün olduğunca az karakter yazmak istiyorum. Bu yüzden burada python kullanmak istemiyorum. Beni yanlış anlamayın. Şimdiye kadar Python tercih ettiğim programlama dilidir ve günlük olarak kullanıyorum.
guettli

Yanıtlar:


18

Kullanabilirsin rename...

rename -n 's/^[0-9]+ - //' *

-nDosyaları gerçekten yeniden adlandırmak için test ettikten sonra kaldırın

açıklama

  • s/old/new/yerine oldsahipnew
  • ^ ipin başlangıcı
  • [0-9]+ bazı numaralar

ne tür regex çiçek renamearacı tarafından desteklenir . PCRE kullanıyor mu? ... müthiş olur.
guettli

5
@guettli kesinlikle, hayır PCRE değil (Perl Uyumlu Düzenli İfadeler). renameTam Perl düzenli ifade desteği vardır böylece bir Perl script; PCRE bunun sadece bir alt kümesidir. Ancak, PCRE'den bildiğiniz her şey geçerli olacaktır rename.
terdon

@terdon Uygulamayı önemsemiyorum. Matematik gözlükleriyle bakarsanız rename, perl uyumlu düzenli ifadelere sahiptir. Evet, pcre uygulaması kullanılmaz. Bunu anladım :-) Hızlı cevabınız için teşekkür ederim.
guettli

9

bash başlangıçtan gerekli kısmı çıkarmak için parametre genişletme:

for f in *[[:blank:]]*.ogg; do echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Genişletilmiş biçim:

for f in *[[:blank:]]*.ogg; do 
    echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"
done

echokuru çalışma içindir; gerçek eylem için ondan kurtulun:

for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Misal:

% ls -1
1 - 01 - Hoffnung.ogg
2 - 02 - Familie.ogg

% for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done 

% ls -1                                                                             
01 - Hoffnung.ogg
02 - Familie.ogg

Evet çalışıyor. Teşekkür ederim. Python'dan perl uyumlu düzenli ifadeyi bildiğimden (günlük kullandığım), renamekomutu tercih ederim . (Daha az yazım gerekir).
guettli

1
@guettli rename, PCRE hakkında bilginiz varsa gidilecek yoldur; renameCevap zaten verilmiş saf ile hareket etmek zorunda olduğu bash. Sadece nota, python'in re(veya regex) modülü BTW tam PCRE uyumlu değildir.
heemayl

@guettli Ayrıca cevabımı indirdin mi? : O
heemayl

Evet yaptım ve yorumunuzu iptal ettim. Umarım kişisel olarak almazsın. Beni yanlış anlamayın, ama benim kişisel görüşüm ${f#[[:digit:]]*-[[:blank:]]}bunun çirkin olması. Evet çalışıyor. Ama biz 21. yüzyılda yaşıyoruz. Bence "işe yarıyor" dan "kolay ve eğlenceli" ye geçmenin zamanı geldi. Amaç "işe yarıyor" ise, linux kullanıcı dostu olmama önyargısını asla kaybetmeyecektir. Zaten çok fazla oy aldığınızdan, bu bir aşağı oy acı vermemelidir (umarım). Eğer öyleyse, söyle bana, ben de geri alacağım.
17'de guettli

1
@guettli Size uygun olan her şey. Burada: gnu.org/software/bash/manual/html_node/… Sadece not etmek için, karakter sınıfı [[:digit:]]ve [[:blank:]]orada uymak için vardı locale, bunlar Regex de oldukça yaygındır.
heemayl
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.