Geçersiz kodlama içeren dosyaları toplu olarak nasıl yeniden adlandırabilir veya geçersiz kodlanmış karakterleri toplu olarak değiştirebilirim?


13

Debian sunucum var ve internet radyo istasyonu için müzik barındırıyorum. Dosya adları ve yolları ile ilgili sorun yaşıyorum çünkü birçok dosya geçersiz bir kodlama içeriyor, örneğin:

./music/Bändname - Some Title - additional Info/B�ndname - 07 - This Title Is Cörtain, The EncÃding Not.mp3

İdeal olarak, harf olmayan her şeyi kaldırmak istiyorum A-Z / a-z veya sayılar 0-9 veya kısa çizgi - /vurgulamak _... Sonuç şöyle bir şeye benzemeli:

./music/Bndname-SomeTitle-additionalInfo/Bndname-07-ThisTitleIsCrtain,TheEncdingNot.mp3

Çok sayıda dosya ve dizin için bu nasıl başarılır?

Bu benzer soruyu gördüm: özel karakterlere sahip dosyaları toplu yeniden adlandırma (veya doğru görüntüleme)

Ancak bu sadece kodlamayı düzeltir, yukarıda açıklandığı gibi daha katı bir yaklaşımı tercih ederim.

Yanıtlar:


13

Dosyaları yeniden adlandırmak istiyorsanız bazı sorunlarla karşılaşacaksınız. ve aynı anda rehberler. Sadece bir dosyayı yeniden adlandırmak yeterince kolaydır. Ancak, dizinlerin de yeniden adlandırıldığından emin olmak istiyorsunuz. Basitçe yapamazsın mv Motörhead/Encöding Motorhead/Encoding dan beri Motorhead çağrı sırasında var olmayacak.

Bu nedenle, tüm dosya ve klasörlerin derinlemesine bir geçişine ihtiyacımız var ve ardından yalnızca geçerli dosya veya klasörü yeniden adlandırıyoruz. GNU ile aşağıdaki işler find ve OS X'imde Bash 4.2.42.

#!/usr/bin/env bash
find "$1" -depth -print0 | while IFS= read -r -d '' file; do
  d="$( dirname "$file" )"
  f="$( basename "$file" )"
  new="${f//[^a-zA-Z0-9\/\._\-]/}"
  if [ "$f" != "$new" ]      # if equal, name is already clean, so leave alone
  then
    if [ -e "$d/$new" ]
    then
      echo "Notice: \"$new\" and \"$f\" both exist in "$d":"
      ls -ld "$d/$new" "$d/$f"
    else
      echo mv "$file" "$d/$new"      # remove "echo" to actually rename things
    fi
  fi
done

Regex’i kullanarak değiştirebilirsiniz. new="${f//[\\\/\:\*\?\"<>|]/}" Windows'un işleyemediği bir şeyi değiştirmek istiyorsanız.

Bu betiği farklı kaydet rename.shile çalıştırılabilir olmasını sağlayın chmod +x rename.sh. Öyleyse, ara rename.sh /some/path.

Dosya adı çakışmalarını çözdüğünüzden emin olun (“ Notice ”Duyurular).

Eğer öyleysen kesinlikle emin doğru değiştirmeleri yapar, echo Senaryodan aslında ne yaptığını basmak yerine işleri yeniden adlandırmak için

Güvende olmak için önce bunu küçük bir dosya alt kümesinde test etmenizi tavsiye ederim.


Seçenekler açıklandı

Burada neler olduğunu açıklamak için:

  • -depth dizinlerin derinlikli olarak tekrarlanmasını sağlayacak, böylece her şeyi baştan sona "yuvarlayabiliyoruz". Genellikle, find farklı şekilde traversler (ancak en başta birinci değil).
  • -print0 sağlar find çıktı null ayrılmış, bu yüzden onu okuyabiliriz read -d '' içine file değişken. Bunu yapmak, boşluk içerenler ve hatta yeni satırlar dahil olmak üzere her tür garip dosya ismini kullanmamıza yardımcı olur.
  • Dosyanın dizinini alacağız dirname. Değişkenlerinizi her zaman uygun şekilde alıntılamayı unutmayın, aksi halde boşluklu veya genel karakterli herhangi bir yol bu komut dosyasını kırabilir.
  • Asıl dosya adını (veya dizin adını) alacağız basename.
  • Ardından geçersiz karakterleri kaldırdık $f Bash'in dize değiştirme yeteneklerini kullanarak. Geçersiz, küçük veya büyük harf, rakam, eğik çizgi olmayan herhangi bir şey anlamına gelir ( \/ ), bir nokta ( \. ), bir alt çizgi veya eksi - kısa çizgisi.
  • Eğer $f zaten temiz (temizlenen ad, geçerli isimle aynı), atlayın.
  • Eğer $new dizinde zaten var $d (örneğin, adlandırılmış dosyalarınız var. resume ve résumé Aynı dizinde), bir uyarı verin. Yeniden adlandırmak istemezsiniz, çünkü bazı sistemlerde mv foo foo soruna neden olur. Aksi takdirde,
  • Sonunda orijinal dosyayı (veya dizini) yeni adıyla yeniden adlandırdık.

Bu sadece en derin hiyerarşide hareket edeceğinden, yeniden adlandırarak Motörhead/Encöding için Motorhead/Encoding iki adımda yapılır:

  1. mv Motörhead/Encöding Motörhead/Encoding
  2. mv Motörhead Motorhead

Bu, tüm değiştirmelerin doğru sırada yapılmasını sağlar.


Örnek dosyalar ve test çalıştırması

Bazı dosyaları bir temel klasörde bulalım. test:

test
test/Motörhead
test/Motörhead/anöther_file.mp3
test/Motörhead/Encöding
test/Randöm
test/Täst
test/Täst/Töst
test/with space
test/with-hyphen.txt
test/work
test/work/resume
test/work/résumé
test/work/schedule

İşte hata ayıklama modunda bir çalışmadan çıktı echo önünde mv ), yani, çağrılacak olan komutlar ve çarpışma uyarıları:

mv test/Motörhead/anöther_file.mp3 test/Motörhead/another_file.mp3
mv test/Motörhead/Encöding test/Motörhead/Encoding
mv test/Motörhead test/Motorhead
mv test/Randöm test/Random
mv test/Täst/Töst test/Täst/Tost
mv test/Täst test/Tast
mv test/with space test/withspace
Notice: "resume" and "résumé" both exist in test/work:
-rw-r—r--  …  …  test/work/resume
-rw-r—r--  …  …  test/work/résumé

İçin mesaj bulunmadığına dikkat edin. with-hyphen.txt, schedule, ve test kendisi.


1
Hedefin bulunduğu durumda işlemek için mantık eklemek isteyebilirsiniz. mv zaten var, bu, (1) zaten temiz olan dosyalarınız varsa ortaya çıkabilir (sonuçta mv foo foo ) veya (2) özel karakterler dışında aynı ada sahip dosyalarınız varsa (ör. mv Encöding Encoding, zaten sahip olduğunuz bir Encoding ek olarak dosya Encöding ).
Scott

İyi fikir, teşekkürler. Bu durumda ne yapılması gerektiğine dair herhangi bir özel öneriniz var mı? Verilmiş - bunu temiz ve akıllıca bir şekilde başarmak, ilk bakışta göründüğünden daha zordur. Bir şey varsa, tabii ki düzenlemek için çekinmeyin.
slhck

Çarpışmaları otomatik olarak ele almayı düşünmenin mantıklı olduğuna inanmıyorum - yalnızca onları kullanıcıya tanıtın ve ele almasına izin verin. Cevabınızı, önerdiğiniz gibi düzenlemiştim.
Scott

Örneği "Encöding" ile kullanmak için +1 Çok fazla fön! :-)
Marcel

Üç yıl sonra hala buraya dönüyorum. çok kullanışlı! :-)
Afri

14

Tam olarak istediğin şeyin bu olmadığını biliyorum, ama orijinal kodlamayı biliyorsanız, belki kullanabilirsiniz convmv Kodlamayı UTF-8 olarak değiştirmek için, çoğu sorunu çözmelidir.

Bu benim için bazı geçersiz kodlanmış Lehçe dosya isimleri olan bir klasörde çalıştı:

convmv -f cp1250 -t utf8 -r .

Bu komutun aslında hiçbir şeyi yeniden adlandırmadığını unutmayın; eklemek --notest Gerçekten dosyaları yeniden adlandırma seçeneği.


1
Statik bir donanıma sahip olanlar (veya çeşitli karakter karakterleri karışımları olmayanlar) convmv seçenek inanılmaz derecede basit ve mükemmel. Çok sayıda karakter grubuna sahip olan OP için bu, diğer cevaplarla birleştirilebilir, çünkü convmv ne zaman ya da doğru formatta karşılaşmadığını bilmek gibi görünüyor. Karakter kümelerini geçerek, üzerinden convmv --list, biri onları doğru bir şekilde kodlayabilecekti.

1
Bununla, eğer OP olarak bir Debian sunucusunu çalıştırırsa, kesinlikle bugünlerde UTF8 varsayacağız, bu durumda orijinal harfleri saklayabilirsiniz. Bazı nordic karakterlerin bir klasörüne sahiptim ve kullandım: convmv -t utf8 --nfc -f iso-8859-1 --notest -r . - --nfc OS X’den önceki Linux’a uymak için convmv (kullanışlı) seçeneklerden vazgeçer.

0

Biliyorum, yeniden adlandırmayı sordun.

Ama gibi yazılımları kullanarak sorunu kolayca çözebilirsiniz MüzikBrainz Picard .

Gerekli tüm verileri (kapak görüntüleri de dahil olmak üzere) devasa bilgisayardan indirerek müziği (ses parmak izi) belirleme yeteneğine sahiptir. MusicBrainz Veritabanınızı ve dosyaları dolaştırarak koleksiyonunuzun istediğiniz herhangi bir formata uymasını sağlar. Ben yıllarca kullanıyorum ve her zaman Kiril alfabesinden Arapçaya kadar her şeyde mükemmel çalışıyor; ve tabii ki (en azından Latin tabanlı betikler için) ASCII'ye dönüşüm de yapabilir.

Bu yaklaşımla, koleksiyonunuzun ne kadar dağınık / kötü bir şekilde adlandırıldığının önemi yoktur, dosyalar okunabilir ve eksiksiz olduğu sürece.

(Ücretsiz olduğunu söylemiş miydim? Hem bedava konuşmada hem de bedava birada olduğu gibi? Hem yazılım hem de veritabanı ..?)

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.