Dosya adındaki sözcüğü değiştirerek birden fazla dosyayı nasıl yeniden adlandırabilirim?


36

ACDC'yi AC-DC'ye değiştirin

Mesela bizde bu dosyalar var

ACDC - Rock N 'Roll Gürültü Kirliliği Yok.

ACDC - Rocker.xxx

ACDC - Thrill.xxx İçin Vur

Olmalarını istiyorum:

AC-DC - Rock N 'Roll Gürültü Kirliliği Yok.

AC-DC - Rocker.xxx

AC-DC - Thrill.xxx İçin Vur

Bu işlem için sed veya awk kullanıldığını biliyorum. Hiçbir şeyi google olarak kullanamıyorum bu yüzden yardımınızı istiyorum =) Lütfen bu görev için tam olarak çalışan bir kabuk komutu verebilir misiniz?

Geri bildirim: OSX kullanıcıları için çözüm


1
Burada daha büyük bir soru olduğunu hissediyorum - genel olarak mp3 dosya adlarını düzeltmeye mi çalışıyorsunuz? Bunu yapmak için yıllar boyunca insanların yazdığı birçok senaryo var. Sanırım kullandığım birine denirdi mp3fixer.
Phil Hollenback,

hayır o ilgili değil mp3'ler Sadece benzer adlarla bazı büyük dosyalar yönetmek zorunda ve bir şey her şey değiştirilebilir veya düzeltilmesi gereken ... ortak durum ben hepsini yeniden adlandırılması için bu şık çözüm gerek böylece
Holms

Yanıtlar:


45
rename 's/ACDC/AC-DC/' *.xxx

itibaren man rename

DESCRIPTION
       "rename" renames the filenames supplied according to the rule specified as the 
first argument.  The perlexpr argument is a Perl expression which is expected to modify the 
$_ string in Perl for at least some of the filenames specified.  If a given filename is not 
modified by the expression, it will not be renamed.  If no filenames are given on
           the command line, filenames will be read via standard input.

Örneğin, uzantıyı silmek için "* .bak" ile eşleşen tüm dosyaları yeniden adlandırmak için

rename 's/\.bak$//' *.bak

Büyük harf adlarını aşağıya çevirmek için

rename 'y/A-Z/a-z/' *

5
Birçok linux makinesinin, regex'leri değil , basit bir ikame uygulayan util-linux'un adını değiştirdiğini unutmayın . Yani, herhangi bir şey yapmadan yeniden adlandırmak sessizce başarısız olursa, muhtemelen yanlış kullanıyorsunuz rename.
Phil Hollenback,

Bunu uzun zamandır arıyordum! thnx!
holms

@PhilHollenback O zaman doğru olanı nasıl bulurum / kurarım? :)
henry

Dosya adlarımda boşluk yerine alt çizgi varken işe yaramaz - nasıl çözebilirim?
takılmadığında

13

Bu cevap, sapkınlıktan ayrı tutulurken diğer tüm yanıtların iyi kısımlarını içerir ls | while read.

Geçerli dizin:

for file in ACDC*.xxx; do
    mv "$file" "${file//ACDC/AC-DC}"
done

Alt dizinler dahil:

find . -type f -name "ACDC*" -print0 | while read -r -d '' file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

Satır karakteri vardır gerçekten Dosya adlarında olması muhtemel, bu nedenle hala adları boşluk içeren çalışırken bu basit olabilir:

find . -type f -name "ACDC*" | while read -r file; do
    mv "$file" "${file//ACDC/AC-DC}"
done


4

Bash kabuğunu kullanma

find . -type f -name "ACDC*" -print0 | while read -d $'\0' f
do
   new=`echo "$f" | sed -e "s/ACDC/AC-DC/"`
   mv "$f" "$new"
done

Not: findkullanımı, geçerli dizini ve altındaki dizinleri işleyecektir.


1

Kabuğuna bağlı. Zsh olarak şunu yapardım:

for file in ACDC*.xxx; do
    mv "$file" "$(echo $file | sed -e 's/ACDC/AC-DC/')"
done

Muhtemelen en iyi çözüm değil, işe yarıyor.


1

Bash kullanarak:

ls *.xxx | while read fn; do
    mv "${fn}" "${fn/ACDC/AC-DC}";
done

Eğer varsa renameprogramın yüklü:

rename 's/ACDC/AC-DC/' *.xxx
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.