Bash ile uzantısız dosyalara ".jpg" dosya uzantısını eklemenin iyi yolu nedir?
Bash ile uzantısız dosyalara ".jpg" dosya uzantısını eklemenin iyi yolu nedir?
Yanıtlar:
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done
"${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.
.jpg
normal dosyalara bile eklendiğini bilin .
Yeniden adlandırmayı kullanabilirsiniz:
rename 's/(.*)/$1.jpg/' *
rename from to file...
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:
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...
Basit, dosyalarınızın bulunduğu dizine cd yapın ve:
for f in *;do mv $f $f.jpg;done
for f in *;do mv "$f" "$f".jpg;done
Dosya adlarındaki boşlukları desteklemek için kullanılırsa daha iyi olur .
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 .
rename --dry-run * -a ".jpg" # test
* -a ".jpg" # rename
--dry-run
ve -a
benim sürümümde mevcut değil rename
. Bu bazı mimariye özgü ise belirtilmelidir.
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.
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;
mv "${file}" "${file}.jpg"
?