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 findmendukungnya, ini dapat dikurangi menjadi
find . -type f -name 'file*' -exec mv {} {}_renamed \;
The xargsVersi ini berguna bila tidak menggunakan {}, seperti di
find .... -print0 | xargs --null rm
Di sini rmdipanggil sekali (atau dengan banyak file beberapa kali), tetapi tidak untuk setiap file.
Saya menghapus basenamepertanyaan Anda, karena mungkin salah: Anda akan pindah foo/bar/file8ke file8_renamed, bukan foo/bar/file8_renamed.
Suntingan (seperti yang disarankan dalam komentar):
- Ditambahkan pendek
findtanpaxargs
- Menambahkan stiker keamanan
xini tidak berguna:find . -type f -name 'file*' -exec mv {} "{}_renamed" \;xargsversi memiliki efisiensi yang sama seperti contoh pertama /