Saya ingin mengganti nama banyak file (file1 … fileN menjadi file1_rename … fileN_renamed) menggunakan find
perintah:
find . -type f -name 'file*' -exec mv filename='{}' $(basename $filename)_renamed ';'
Tetapi mendapatkan kesalahan ini:
mv: cannot stat ‘filename=./file1’: No such file or directory
Ini tidak berfungsi karena nama file tidak ditafsirkan sebagai variabel shell.
Jawaban yang Diterima:
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 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 manfaat bekerja dengan file bernama aneh. Jika find
mendukungnya, ini dapat dikurangi menjadi
find . -type f -name 'file*' -exec mv {} {}_renamed \;
xargs
versi berguna saat tidak menggunakan {}
, seperti dalam
find .... -print0 | xargs --null rm
Di sini rm
dipanggil sekali (atau dengan banyak file beberapa kali), tetapi tidak untuk setiap file.
Saya menghapus basename
dalam pertanyaan Anda, karena mungkin salah:Anda akan memindahkan foo/bar/file8
menjadi file8_renamed
, bukan foo/bar/file8_renamed
.
Suntingan (seperti yang disarankan dalam komentar):
- Menambahkan
find
yang dipersingkat tanpaxargs
- Menambahkan stiker keamanan