Adakah yang bisa menyarankan cara mengubah nama nama file:
head.body.date.txt
Untuk:
head_body_date.txt
Apakah ada pernyataan baris tunggal untuk melakukan penggantian nama di Unix ?
Adakah yang bisa menyarankan cara mengubah nama nama file:
head.body.date.txt
Untuk:
head_body_date.txt
Apakah ada pernyataan baris tunggal untuk melakukan penggantian nama di Unix ?
.tar.gz
ekstensi? Juga, selamat datang di U&L!mv head.body.date.txt head_body_date.txt
. Jika Anda memiliki batasan lain atau contoh nyata, silakan perbarui pertanyaan Anda dengan ini. Seperti yang ada sekarang, tidak jelas apakah pertanyaan tersebut merujuk ke file dengan nama eksplisit itu, direktori tunggal di mana semua file memiliki format tertentu, atau jika Anda ingin mencari hierarki direktori untuk nama-nama tertentu dan mengubahnya.Jawaban:
Ulangi nama file, dan gunakan Parameter ekspansi untuk konversi:
Pola ekspansi parameter,
${f//./_}
menggantikan semua.
s dengan_
s dalam nama file ($f
).Di atas akan melakukan proses kering, untuk memungkinkan penggantian nama sebenarnya terjadi, hapus
echo
:Jika Anda ingin berurusan dengan ekstensi apa pun, tidak hanya
.txt
:Setelah memeriksa hapus
echo
untuk tindakan aktual:Umum, untuk jumlah titik sembarang, setidaknya satu:
sumber
for f in *.*; do ...; done
*.*
meluruskan pola dalam contoh, karena sekarang kode sepertinya berfungsi hanya dengan jumlah titik yang tetap.dengan
perl
berbasisrename
\.[^.]+$(*SKIP)(*F)
lewati pola ini dan cari kecocokan alternatif|\./_/g
ganti semua.
dengan_
Atau, menggunakan lookahead negatif
Setelah ini oke, hapus
-n
opsisumber
Gunakan penggantian regex untuk menemukan semua kecuali instance terakhir
.
dalam nama file (lookahead non-capturing) dan ganti dengan_
. Generalise*.*
jika Anda suka.(versi khusus ini
rename
tampaknya diinstal melaluiutil-linux
). Saya menggunakanUbuntu 12.04
(ya, mesin sangat ketinggalan zaman).sumber
bash
:sumber
mv --
, untuk menjaga terhadap nama file "lama" yang dimulai dengan-
. (2) Anda harus memasukkan$old
tanda kutip ("$old"
), untuk menjaga dari nama file "lama" yang berisi spasi atau karakter yang khusus untuk shell (seperti*
dan?
). (3) Jawaban Anda gagal dalam kasus yang agak patologis di mana ekstensi berisi garis bawah:head.body.date.t_xt
diubah namanya menjadihead_body_date_t.xt
.Menggunakan
mv
,sed
danrev
dalam satu baris:Jika Anda ingin menerapkannya pada semua
txt
file dalam rep saat ini, menggunakan gumpalan tampaknya rumit karena caramv
kerjanya, tetapi Anda dapat melakukanfor
loop dalam satu-liner:Sedikit lebih lama, tetapi Anda dapat mencocokkan beberapa pola dalam lingkaran Anda!
sumber
$(ls …)
; lakukan sajafor file in *.txt
. (2) Anda harus menggunakan lebih kutipan:mv "$file" "$(…)"
.rename
seperti beberapa orang lain telah menyarankan dalam jawaban mereka terdengar lebih sederhana ...Ini sesederhana itu untuk satu file pada satu waktu. Anda tidak menentukan apakah Anda ingin ini dilakukan secara rekursif dalam suatu direktori atau pada keseluruhan direktori, sehingga itu akan menjadi solusi cepat dan paling nyaman bagi Anda.
sumber