Bagaimana cara mengganti nama banyak file dengan menghapus ekstensi?

13

Saya memiliki sejumlah file tiff bernama:

sw.001.tif
sw.002.tif
...

dan saya ingin menghapus .tifdi akhir setiap file. Bagaimana saya bisa menggunakan renameperintah untuk melakukan ini?

Paul
sumber
2
Ingatlah bahwa TIDAK ada linux atau unix filesystem yang menggunakan "ekstensi" gaya Windows atau VMS - hanya dengan konvensi bahwa akhiran nama file adalah ".tif" atau ".c" atau ".c" atau ".o" atau ".so " atau terserah.
Bruce Ediger
Tidak apa-apa ... Saya mengimpor file dari windows ke linux :)
Paul
1
Secara teknis, Windows juga tidak menggunakan ekstensi file, hanya saja pengelola file Windows 95 tetap menggunakan karakter terakhir dari nama file untuk menentukan tipe file setelah keluar dari skema penamaan MS-DOS dan konvensi itu tetap ada.
RAKK

Jawaban:

23

perl's rename(seperti biasanya ditemukan di Debian di mana juga disebut prename), atau turunan ini ( renamepaket di Debian):

rename 's/\.tif$//' *.tif

util-linux rename(seperti yang biasanya ditemukan di Red Hat, rename.uldi Debian):

rename -- .tif '' *.tif

(perhatikan bahwa seseorang akan mengganti nama blah.tiffany.tifmenjadi blahfany.tif)

Ignacio Vazquez-Abrams
sumber
2
Saya percaya nama "Debian" adalah oleh Larry Wall (dilengkapi dengan Perl?) Dan "Red Hat" satu dari util-linux (rename.ul di Debian IIRC).
XTL
@XTL: Benar. Saya hanya memanggil mereka karena mereka adalah program "ganti nama" yang ditemukan dalam turunan Debian atau Red Hat.
Ignacio Vazquez-Abrams
Terima kasih banyak! Saya tidak pernah menyadari bahwa ada berbagai versi 'ganti nama'. Saya berasumsi ada perbedaan halus lainnya antara perintah di debian & redhat. Saya harus mencari beberapa perbedaan mereka.
Paul
6

Untuk non-rename, Anda dapat melakukan:

$ for i in *.tif; do mv -i $i `basename $i .tif`; done

(-i untuk memperingatkan agar tidak mengganti file)

XTL
sumber
15
Versi lebih cepat lebih aman:for i in ./*.tif; do mv -i "$i" "${i%.tif}"; done
jw013
Memberi +1 pada komentar terakhir di sini. Lebih aman pada nama file dengan ruang kosong.
petoben
1
@ jw013 komentar Anda harus menjadi jawaban tingkat atas.
Roland
1
rename -- .oldext .newext *.oldext

Ini menggantikan ekstensi lama dengan yang baru. Untuk menghapus ekstensi, Anda dapat secara eksplisit meneruskan string kosong sebagai argumen.

rename -- .gz.tmp  '' *.gz.tmp

Dengan perintah di atas, semua file dengan .gz.tmpekstensi di folder saat ini akan diubah namanya menjadi filename.gz.

Lihat artikel: Linux: hapus ekstensi file untuk banyak file untuk detailnya.

Manpreet Singh
sumber
1
Itu mengasumsikan implementasi util-linux renameyang tidak kompatibel dengan (dan jauh lebih terbatas dari) renameperintah tradisional dari perl.
Stéphane Chazelas
Juga perhatikan bahwa itu menggantikan kemunculan pertama.oldext dalam nama file, belum tentu ekstensi ( foo.oldextasy.oldextakan diubah namanya menjadi footasy.oldext).
Stéphane Chazelas
1

Jika Anda menggunakan IBM AIX Anda tidak akan memiliki renameperintah, jadi untuk menghapus batch ekstensi file Anda harus menggunakan perintah vanilla System V UNIX:

for file in *.tif; do
   mv $file `echo $file | sed 's/.tif$//'`;
done;
RAKK
sumber
-2

dapatkah kita membuat ini rekursif

for i in *.gz; do mv -i $i `basename $i .gz`; done
pengguna3361573
sumber