Linux regex dosyası taşıma


2

Dosyaları düzenli bir ifadeye dayanarak alt klasörlere taşımaya çalışıyorum. Örneğin, TV şovlarını doğru şov ve sezon klasörüne taşımaya çalışıyorum. Tüm dosyalar "Show Name.S00E00.episode title.avi" desenini takip eder.

Mmv'ye baktım ve yeniden adlandırdım, ancak yararlı örnekler bulamadım.

Biri beni doğru yöne işaret edebilseydi çok minnettar olurdum.

Düzenleme: Klasör yapısını söylemeyi unuttum

./
   Unsorted video files 
   Show Name/
      Season 1/
           Video Files Sorted
      Season 2/

Yanıtlar:


3

İçin darbe kabuğu:

for file in *.avi; do
    # use perl to transform the file name; could use 'sed -r' too
    new_path=$(perl -pe 's|^(.+?)\.S0*(\d+)E0*(\d+)\.(.+)\.(\w+)$|$1/Season $2/Episode $3 - $4.$5|' <<< "$file")
    # create directories if needed
    mkdir -p "${new_path%/*}"
    # move the file
    mv -vn "$file" "$new_path"
done

Bu regexp example ( s|...|...|) içinde:

  • $1şovun adı (" .S<num>E<num>" 'a kadar olan her şey );
  • $2ve $3sezon / bölüm numaraları;
  • $4bölüm başlığı (" ." final "e kadar olan her şey );
  • $5 dosya uzantısıdır.

Eğer sezon / bölüm numaraları lider sıfırları tutmak değiştirmek istiyorsanız S0*ve E0*sadece birlikte Sve E. Diğer dosya türlerini işlemek istiyorsanız *.avi, ilk satırda ayarlayın .


Debian ve Ubuntu prenamebunun için kullanılabilecek Perl tabanlı bir komut dosyası ile birlikte gelir , ancak yeni dizinleri otomatik olarak oluşturmaz. Bunu yapmak için değiştirmek kolaydır ; o zaman sadece kullanabilirsiniz prename 'the above regexp' *.avi.)


Sezon ismi için neden (. +?), Neden sadece (. +)
bbaja42

1
@ bbaja42 .+?açgözlü değildir, yani mümkün olduğu kadar az eşleşir.
Tyilo

0

Veya sadece bash komutlarını sonuna kadar kullanabilirsiniz (eğer tüm dosyalarınız verdiğiniz yapıya uyuyorsa):

for episode in *avi ; do
  ### cut $episode into fields, separated by "." and assign the first such field to $showname
  ### assign the second and third character of the second field to $season
  showname=`echo $episode | cut -d "." -f1`
  season=`echo $episode | cut -d "." -f2 | cut -c 2,3`
  ### create directory only if not already created
  mkdir -p $showname/$season
  ### move the file
  mv $episode $showname/$season/
done
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.