Berikut ini adalah perbaikan langsung dari pendekatan Anda:
find . -type f -name 'file*' -exec sh -c 'x="{}"; mv "$x" "${x}_renamed"' \;
Namun, ini sangat mahal jika Anda memiliki banyak file yang cocok, karena Anda memulai shell baru (yang mengeksekusi a mv
) untuk setiap pertandingan. Dan jika Anda memiliki karakter lucu dalam nama file apa pun, ini akan meledak. Pendekatan yang lebih efisien dan aman adalah ini:
find . -type f -name 'file*' -print0 | xargs --null -I{} mv {} {}_renamed
Ini juga memiliki keuntungan bekerja dengan file yang anehnya bernama. Jika find
mendukungnya, ini dapat dikurangi menjadi
find . -type f -name 'file*' -exec mv {} {}_renamed \;
The xargs
Versi ini berguna bila tidak menggunakan {}
, seperti di
find .... -print0 | xargs --null rm
Di sini rm
dipanggil sekali (atau dengan banyak file beberapa kali), tetapi tidak untuk setiap file.
Saya menghapus basename
pertanyaan Anda, karena mungkin salah: Anda akan pindah foo/bar/file8
ke file8_renamed
, bukan foo/bar/file8_renamed
.
Suntingan (seperti yang disarankan dalam komentar):
- Ditambahkan pendek
find
tanpaxargs
- Menambahkan stiker keamanan
x
ini tidak berguna:find . -type f -name 'file*' -exec mv {} "{}_renamed" \;
xargs
versi memiliki efisiensi yang sama seperti contoh pertama /