tüm dosyalara yinelemeli olarak dosya uzantısı ekleyin


106

Dosya uzantısı olmayan dosyalar içeren birkaç dizinim ve alt dizinlerim var. .jpgBu dizinlerde bulunan tüm dosyalara eklemek istiyorum . Dosya uzantısını değiştirmek için bash betikleri gördüm, ancak sadece bir tane eklemek için değil. Aynı zamanda özyinelemeli olması gerekiyor, biri yardım edebilir mi lütfen?

Yanıtlar:


228

Açık döngü içermeyen alternatif komut ( man find):

find . -type f -exec mv '{}' '{}'.jpg \;

Açıklama: Bu, geçerli dizinden ( -type f) başlayarak tüm dosyaları ( ) özyinelemeli olarak bulur .ve mvher birine taşıma komutunu ( ) uygular . Etrafında da tırnak Not {}boşluklar (ve hatta yenisatırlar ...) ile dosya adları düzgün işlenir böylece.


7
Özellikle, dizin yapısında çok sayıda dosya varsa (bash'nin yinelenecek dosya listesinin uzunluğu konusunda üzülmesine neden olur) bu daha iyi çalışır.
DrAl

@Al, forbir dosya listesi üzerinde yinelemek için bir döngü üzücü bash'a başvurursanız , bu doğru değildir. Bash fordöngüsü her mvkomutu yinelemeli olarak yayınlar .
nik

Soru: İfadeyi yürütmeden öncefind ilk olarak bir dosya listesi oluşturur mu? Sanırım öyle, ama sonsuz döngüleri kodlamadan önce bu noktayı netleştirmek istiyorum. -exec
Boldewyn

2
bu komut uzantısı olan dosyaları da bulacaktır. OP'nin istediği bu mu?
ghostdog74

1
@ ghostdog74: Bu yanıtı kabul ettiğinden, yukarıdaki hile yaptı. Aksi takdirde, aşağıda belirttiğiniz gibi eklemek işinizi -not -name "*.*"görecektir.
Stephan202

62

bu, uzantısı olmayan dosyaları bulur ve .jpg dosyanızı ekler

find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \;

Bu, kesinlikle istenen sonucu% 99 oranında sağlayacaktır. +1
les

9

Bu biraz geç, ancak şimdiye kadarki çözümlerden daha iyi bir çözüm (belki daha az okunabilir olsa da) ekleyeceğimi düşündüm:

find /path -type f -not -name "*.*" -print0 | xargs -0 rename 's/(.)$/$1.jpg/'

find | xargsHer dosya için yeni bir işlem çatallamanız gerekmediğinden , kalıbı kullanmak genellikle daha verimli yürütme ile sonuçlanır.

Bunun, geleneksel yeniden adlandırma yerine Debian aromalı dağıtımlarda bulunan yeniden adlandırma sürümünü (ön ad olarak da bilinir) gerektirdiğini unutmayın. Bu sadece küçük bir perl betiği olsa da, yukarıdaki komutu herhangi bir sistemde kullanmak yeterince kolay olacaktır.


4

bunun gibi,

for f in $(find . -type f); do mv $f ${f}.jpg; done

Boşluklarla ayrılmış dosya adlarınızın olmasını beklemiyorum,
eğer varsa, adların biraz işlenmesi gerekecektir.

Eğer başka bir dizinden komutunu çalıştırmak istiyorsanız,
sen yerini alabilir find .ile find /target/directory.


1
Bu bir 'do' eksiktir ve dosya adında boşluklar varsa, dosya adını alıntılamak daha iyi olabilir: for f içinde $ (find. -Type f); mv "$ f" "$ {f} .jpg" yap; bitti
DrAl

ve muhtemelen bunu üst düzey dizinden çalıştırırdım?
robjmills

@seengee: evet. Bu komutun da kısa çizgiyi kaçırdığını unutmayın -type.
Stephan202

Bir yere gitmem ve çok hızlı yazmam gerekiyordu ... şimdi düzeltiyorum.
nik

1

Windows temelde uzantısı olmayan tüm dosyaları yeniden adlandırmak için yapabilirsiniz ren * *.jpg Dosya uzantısız olduğundan, sadece * kullanın veya png'yi jpg olarak değiştirmek istiyorsanızren *.png *.jpg


0

rename

Uzantıları olmayan dosyaları yeniden adlandırabileceğinden emin değilim (şu anda Windows 7 kullanıyorum)


1
olabilir, ancak aynı zamanda dizinleri yeniden adlandıracak ve alt dizinlerde yinelemeli olarak çalışmasını söylemenin bir yolu yok (en azından Ubuntu'da sahip olduğum sürümle).
mirod

renameBiri util-linux-ng'de bulunan bir C programı ve üniversitemizin Debian makinelerinde (Wall'un kendisi tarafından) Perl programı olarak adlandırılan en az iki farklı komut biliyorum . Aslında ikisinin de hiçbiri yineleme yapmaz.
Boldewyn
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.