Bash ile dosyalara dosya uzantısı ekleyin


94

Bash ile uzantısız dosyalara ".jpg" dosya uzantısını eklemenin iyi yolu nedir?


3
mv "${file}" "${file}.jpg"?
onteria_

2
Size göre "uzantısız dosya" nedir? Adında nokta olmayan bir dosya mı?
glenn jackman

Yanıtlar:


118
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done

8
ikincisi, uzantısız dosyaları yeniden adlandırmak için mükemmeldir! Teşekkürler!
anon58192932

2
İkincisi ise tüm dosyaların, sadece extensionless olanlar üzerinde bir uzantısı ekler
Jeff

5
tıpkı bir notun "${f%.jpg}"bash kabuğu dizesi manipülasyonu olduğu gibi. $ {string% substring} `$ string'in arkasından en kısa $ substring eşleşmesini siler.
Jichao

Uyarı: Karışık uzantılara sahip bir klasörünüz varsa, yukarıdakilerin .jpgnormal dosyalara bile eklendiğini bilin .
sachinruk

61

Yeniden adlandırmayı kullanabilirsiniz:

rename 's/(.*)/$1.jpg/' *

3
hangi yeniden adlandırma sürümünü kullanıyorsunuz? Benimkinin farklı argümanları var:rename from to file...
B Johnson

1
yeniden adlandırma, 5.10.1 sürümü olan perl ile birlikte gelir.
Kim Stebel

3
Bu, Ubuntu'da bulunan yeniden adlandırma ile harika çalışıyor (ve bu yüzden tüm Debian tabanlı dağıtımları tahmin ediyorum), jm666'nın cevabından çok daha az ayrıntılı.
Roger Heathcote

28

Başka bir yol - döngüler olmadan

find . -type f -not -name "*.*" -print0 |\
xargs -0 file |\
grep  'JPEG image data' |\
sed 's/:.*//' |\
xargs -I % echo mv % %.jpg

Yıkmak:

  • uzantısı olmayan tüm dosyaları bul
  • dosya türünü kontrol edin
  • sadece JPG dosyalarını filtrele
  • dosya türü bilgisini sil
  • xargs her dosya için "mv" yi çalıştırın

yukarıdaki komut kuru çalıştırma içindir , bundan sonra mv'den önce "echo" yu kaldırmalısınız.

DÜZENLEME Bazı insanlar burada gerekli olduğunu öne sürüyorlar "Yol argümanlarını tırnak içine alın; argümanların boşluklu yollarda bölünmesini önler" .

Bu öneri genellikle doğrudur, bu durumda değildir. Burada, çünkü %yerine var olan olmayan kabuk genleşmesiyle ancak ile xargs, yani iç (direkt olarak) %hatta dosya isimleri boşluk ile düzgün ikame edilecektir.

Basit demo:

$ mkdir xargstest
$ cd xargstest

# create two files with spaces in names
$ touch 'a b' 'c d'

$ find . -type f -print
./c d
./a b
# notice, here are spaces in the above paths

#the actual xargs mv WITHOUT quotes
$ find . -type f -print | xargs -I % mv % %.ext

$ find . -type f -print
./a b.ext
./c d.ext
# the result is correct even in case with spaces in the filenames...

Bunu bir döngüye koyabilirsiniz ve bu xarjlar gereksizdir. Bu durumda Ryan'ın cevabını daha çok seviyorum.
Lucius

1
@Lucius - btw, soru "uzantısız" dosyalar istiyor - bu yüzden Ryan yalnızca bunları
bulmalı

@ jm666 hey! bir klasördeki tüm uzantısız dosyaları kendi uzantılarına göre yeniden adlandırmak için kod pasajınızı nasıl değiştirebilirim. (
-B

24

Basit, dosyalarınızın bulunduğu dizine cd yapın ve:

for f in *;do mv $f $f.jpg;done

Nedense bu benim için işe yarıyor, ancak Seth'in alıntılarla çözümü işe yaramıyor. (OSX Mountain Lion bash)
delrocco

4
for f in *;do mv "$f" "$f".jpg;doneDosya adlarındaki boşlukları desteklemek için kullanılırsa daha iyi olur .
Hritik

Bu zarif ve basit çözüm için teşekkürler - Bu yanıtı defalarca aldım ama ezberleyemiyorum. #dejavu
Tim Andersen

15

kuru çalışma:

 rename -n s/$/.jpg/ *

gerçek yeniden adlandırma:

 rename s/$/.jpg/ *

6
find . | while read FILE; do if [ $(file --mime-type -b "$FILE") == "image/jpeg" ]; then mv "$FILE" "$FILE".jpg; fi; done;

1

Kullandım böylece Benim durumumda ben filetype farkında değildi mv yardımıyla komutu dosya incelemek ve muhtemelen dosya türünü bulmak için komuta. Bu çözüm tüm dosyalar için mükemmel olmayabilir, çünkü file komutu dosya türünü tanımayabilir, ancak benim için çoğunlukla iyi çalıştı.

for f in *; do ext=$(file $f | awk '{print $2;}'); mv -n "$f" "$f.$ext"; done

Awk komutunun kullanımı , gerçekte uzantı olan komut dosyasından döndürülen dizenin ikinci kelimesini çıkarmaktır .


jpg ve png'yi otomatik olarak işler. kullandım ve işe yarıyor - çok teşekkürler! Yalnızca artık uzantılar CAPS'dir. küçük sorun olsa da :)
krivar


0

Birden çok dosyayı taşımayı kullanabilirsiniz . Ben bu projenin geliştiricisiyim. Sözdizimi basittir.

mmf files*

$ EDITOR'unuzu tüm dosya adlarıyla veya varsayılan olarak vim ile açar ve vim'de Ctrl + v + G kullanarak tüm dosya adlarının sonunu vurgulayabilir, dosyayı kaydedebilir, çıkabilirsiniz ve tüm dosyalarınız yeniden adlandırılır.


-2

Ryan Li

Dosya uzantısı olmayan bir dizindeki birden çok dosyaya dosya uzantısı eklemek için doğru sözdizimi

find . | while read FILE; do if [[ -n `file --mime-type "$FILE" | grep 'message/rfc822'` ]]; then  mv "$FILE" "$FILE".eml; fi; 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.