Ini juga dapat dilakukan dengan xargs
dan sed
untuk mengubah ekstensi file.
ls | grep \.png$ | sed 'p;s/\.png/\.jpg/' | xargs -n2 mv
Anda dapat mencetak nama file asli beserta nama file yang Anda inginkan. Kemudian minta xargs menggunakan kedua argumen tersebut dalam perintah pindah. Untuk one-liner, saya juga menambahkan grep untuk memfilter apa pun yang bukan file *.png.
bagaimana cara mengganti nama file sehingga saya hanya dapat memiliki satu ekstensi.
cd dir/with/messedup/files
for file in *.png.jpg; do
mv "$file" "${file%.png.jpg}.jpg"
done
di masa mendatang, dengan menggunakan xargs, bagaimana cara mengubah ekstensi file yang mirip dengan perintah kedua?
Sepengetahuan saya, itu tidak bisa dilakukan. Cara terbaik untuk melakukannya adalah dengan menggunakan for-loop dengan substitusi parameter seperti di atas:
for file in *.png; do
convert "$file" -resize "${file%.png}.jpg"
done
Jika Anda memiliki file di subdirektori yang ingin dikonversi, Anda dapat mem-pipe find
ke while read
lingkaran:
find . -type f -name '*.png' |
while read file; do
convert "$file" -resize "${file%.png}.jpg"
done
CATATAN: Biasanya dianggap ide yang buruk untuk menggunakan hasil ls
dalam skrip shell. Meskipun contoh Anda mungkin berfungsi dengan baik, ada banyak contoh yang tidak. Misalnya, jika nama file Anda memiliki baris baru di dalamnya (yang memungkinkan unix), ls
mungkin tidak akan lolos dari mereka untuk Anda. (Itu sebenarnya tergantung pada implementasi Anda, yang merupakan alasan lain untuk tidak menggunakan ls
dalam skrip; perilakunya sangat bervariasi dari satu kotak ke kotak berikutnya.) Anda akan mendapatkan hasil yang lebih konsisten jika Anda menggunakan find
dalam pengulangan sementara-baca atau globbing file (mis. *.png
) dalam perulangan for.