Tambahkan ekstensi file ke file dengan bash

94

Apa cara yang baik untuk menambahkan ekstensi file ".jpg" ke file tanpa ekstensi dengan bash?

Adrian
sumber
3
mv "${file}" "${file}.jpg"?
onteria_
2
Menurut Anda, apakah yang dimaksud dengan "file tanpa ekstensi"? Apakah itu file tanpa titik di namanya?
glenn jackman

Jawaban:

118
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done
Seth Robertson
sumber
8
yang kedua sangat cocok untuk mengganti nama file tanpa ekstensi! Terima kasih!
anon58192932
2
yang kedua menambahkan ekstensi pada semua file, bukan hanya yang tanpa ekstensi
Jeff
5
seperti catatan "${f%.jpg}"adalah manipulasi string bash shell. `$ {string% substring}` Menghapus kecocokan terpendek dari $ substring dari belakang $ string.
Jichao
Peringatan: Jika Anda memiliki folder dengan ekstensi campuran, ketahuilah bahwa hal di atas menambahkan .jpgbahkan file normal.
sachinruk
61

Anda dapat menggunakan ganti nama:

rename 's/(.*)/$1.jpg/' *
Kim Stebel
sumber
3
versi ganti mana yang Anda gunakan? Punyaku memiliki argumen yang berbeda:rename from to file...
B Johnson
1
rename disertakan dengan perl, yaitu versi 5.10.1.
Kim Stebel
3
Ini berfungsi dengan baik dengan penggantian nama yang disertakan dalam Ubuntu (dan jadi saya menebak semua distro berbasis Debian), jauh lebih sedikit verbose daripada jawaban jm666.
Roger Heathcote
28

Cara lain - tanpa loop

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

Kerusakan:

  • temukan semua file tanpa ekstensi
  • periksa jenis file
  • filter file JPG saja
  • hapus info jenis file
  • xargs menjalankan "mv" untuk setiap file

perintah di atas adalah untuk dry run , setelah itu Anda harus menghapus "echo" sebelum mv

EDIT Beberapa orang menyarankan bahwa di sini diperlukan "Bungkus argumen jalur dalam tanda kutip; hindari pemisahan argumen pada jalur dengan spasi" .

Biasanya, rekomendasi ini benar, dalam hal ini tidak. Karena, di sini %diganti bukan oleh ekspansi shell tetapi oleh xargsinternal (langsung), sehingga %akan diganti dengan benar bahkan dengan spasi di nama file.

Demo sederhana:

$ 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...
jm666
sumber
Anda dapat memasukkan ini ke dalam satu lingkaran dan xargs ini berlebihan. Saya lebih suka jawaban Ryan dalam situasi ini.
Lucius
1
@Lucius - btw, pertanyaannya ingin file "tanpa ekstensi" - jadi Ryan seharusnya hanya menemukan yang ...
jm666
@ jmhhhhhhhhhhh bagaimana cara mengubah cuplikan kode Anda untuk mengganti nama semua file tanpa ekstensi dalam folder menjadi ekstensi masing-masing. (Saya mendeteksi ekstensi yang benar dengan perintah file -b $ filename.)
Soumyajit
24

Sederhana, cd ke direktori tempat file Anda berada dan:

for f in *;do mv $f $f.jpg;done
bharath
sumber
Untuk beberapa alasan ini berhasil untuk saya, tetapi solusi Seth dengan tanda kutip tidak. (
Pesta
4
Akan lebih baik jika digunakan for f in *;do mv "$f" "$f".jpg;doneuntuk mendukung spasi pada nama file.
Hritik
Terima kasih atas solusi yang elegan dan sederhana ini - Saya telah mendapatkan jawaban ini beberapa kali, tetapi sepertinya tidak dapat menghafalnya. #dejavu
Tim Andersen
16

lari kering:

 rename -n s/$/.jpg/ *

penggantian nama sebenarnya:

 rename s/$/.jpg/ *
Alexey
sumber
6
find . | while read FILE; do if [ $(file --mime-type -b "$FILE") == "image/jpeg" ]; then mv "$FILE" "$FILE".jpg; fi; done;
Ryan Li
sumber
1

Dalam kasus saya, saya tidak mengetahui jenis file jadi saya menggunakan perintah mv dengan bantuan perintah file untuk memeriksa dan mungkin menemukan jenis file. Solusi ini mungkin tidak sempurna untuk semua file karena perintah file mungkin tidak mengenali jenis file tetapi sebagian besar berfungsi dengan baik untuk saya.

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

Penggunaan awk adalah untuk menghapus kata kedua dari string yang dikembalikan dari file perintah yang sebenarnya merupakan ekstensi.

Paolo
sumber
menangani jpg dan png secara otomatis. menggunakannya dan berfungsi - terima kasih banyak! Hanya sekarang ekstensi CAPS. masalah kecil :)
krivar
0
rename --dry-run * -a ".jpg" # test  
* -a ".jpg" # rename
Roman Rhrn Nesterov
sumber
--dry-rundan -atidak tersedia dalam versi saya rename. Jika ini khusus untuk beberapa arsitektur, ini harus ditentukan.
Fernando César
0

Anda dapat menggunakan memindahkan banyak file . Saya adalah pengelola proyek ini. Sintaksnya sederhana.

mmf files*

Ini akan membuka $ EDITOR Anda dengan semua nama file, atau vim secara default dan Anda cukup menyorot akhir dari semua nama file menggunakan Ctrl + v + G di vim, menyimpan file, keluar dan itu, semua file Anda diganti namanya

Almas Abdrazak
sumber
-2

Ryan Li

Sintaks yang benar untuk menambahkan ekstensi file ke beberapa file dalam direktori yang tidak memiliki ekstensi file adalah

find . | while read FILE; do if [[ -n `file --mime-type "$FILE" | grep 'message/rfc822'` ]]; then  mv "$FILE" "$FILE".eml; fi; done;
Dillon Beresford
sumber