Tambahkan ekstensi file ke file dengan bash


94

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


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

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/' *

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...

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

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/ *

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

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.


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

--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


-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;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.