Bash'daki dosya adlarındaki sondaki karakterler nasıl kaldırılır?


13

Aşağıdaki gibi bir sürü medya dosyaları var:

tvshow.s01e11]Bloodlines.avi
tvshow.s01e12]suffer.avi
tvshow.s01e13]NotMe.avi

Onları yeniden adlandırmak istiyorum

tvshow.s01e11.avi
tvshow.s01e12.avi
tvshow.s01e13.avi

Yeniden adlandırmayı kullanmayı denedim ama sözdizimi doğru alamıyorum çünkü başarısız oluyor.


Hiç bir GUI bunu yapmak istiyorsanız krename, güzel. Her türlü güçlü seçeneğe sahiptir ve gerçekten yapmadan önce ne yapacağını gösterir. Daha sonra bash'de kullanabileceğiniz kalıpları test etmek için bile kullanabilirsiniz.
Joe

Yanıtlar:



14

Kabukta, basitçe şunlar yapılabilir:

for x in *]*.avi ; do 
    mv -i "$x" "${x%]*.avi}.avi"
done

Kabuk, dosya adlarının listesini yalnızca normal bir globla ${var%pattern}oluşturabilir ve değişken içindeki dizenin sonundan (en kısa) eşleşen deseni kaldırır var. Son uzantı her zaman olduğundan .avi, desenle kaldırdım ve geri ekledim. Tırnak işaretleri ile bu, boşluk içeren dosya adlarıyla da çalışmalıdır.Fancy Name for a Show.s01e01]Asdf.avi


@NoviceC extglob paterni kötü bir fikir değildi. Aslında, ${x/]*([^.])}yapılması gereken bir şey, bir braketi ve herhangi bir sayıdaki noktayı kaldırır. (dize sonuna kadar kilitli olmadığından başka parantez veya noktalar varsa başarısız olur)
ilkkachu

İyi bir noktaya değindin. Ama gitmem ${x/]*.avi}ve sadece .avisenin gibi bir şey eklemem gerektiğinde sorunu çok fazla karmaşıklaştırdım . Ama aynı zamanda isimdeki boşlukların nasıl kırılacağından da memnun kalmadım (`find . -name '*]*.avi'`). Yeniden adlandırma olmadığı için sınırlı bir standart unix komut yöntemi sunmaktan mutluluk duydum, ancak bu benimkini sudan atıyor.
Acemi C

2

Bu her türlü pratik değildir - diğer cevaplar çok daha hızlı ve daha kısadır - ama ...

PowerShell kullanabilirsiniz! Microsoft son zamanlarda açık kaynaklı ve çapraz platform haline getirdi. İşletim sisteminize ilişkin indirmeler ve kurulum talimatları için "PowerShell'i Alın" bölümüne bakın .

Yüklendikten sonra, bu kısa komut dosyasını kullanabilirsiniz:

Get-ChildItem -File '*]*.avi' | ForEach-Object {
    Rename-Item $_ -NewName (($_.Name -Split ']')[0] + '.avi')
}

Temel olarak, geçerli dizinde bir dosya eşleşmesi olan her nesneden geçer *]*.avi, parçayı parantezden önce alır, .aviüzerine yapışır ve bunu yeni ad olarak atar.

Doğrudan Bash'ten çalıştırmak için, bu yarı golf tekli astarı kullanın:

powershell -command $'gci -File \'*]*.avi\'|%{rename-item $_ -NewName (($_.Name -Split \']\')[0]+\'.avi\')}'

Bu Yığın Taşması cevabının izniyle kaçan alıntı .

(Windows'ta Ubuntu'da Bash'te test edildi. Muhtemelen PowerShell ile yapmanın çok daha kısa bir yolu var, ancak düzenli ifadeler bilmeyen insanlar için anlaşılabilir bir şey göstermek istedim.)


Rube Goldberg gurur duyardı! Regexes, öğrenmek için gerçek bir PITA'dır, ancak birçok kez buna değer - ilkel düzeyde bile kullanabilirim.
Joe

1

Debian, diğer dağıtımlarda da bulunabilecek mmv adında bir pakete sahiptir ve eğer değilse kaynaktan derlenecek kadar kolay olmalıdır. Bunu yazmanıza izin verir:

mmv '*]*.avi' '#1.avi'

Daha fazla ayrıntı için bu komutun Ubuntu kılavuz sayfasını okuyabilirsiniz .


0

Bu, deseni arar ve sed kullanarak metni değiştirir.

 $sed 's/\(.*]\)[a-zA-z0-9].*\(.avi\)/\1\2/' filename
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.