Ketika mencoba mengonversi beberapa file menjadi huruf kecil, saya perhatikan sesuatu yang terasa aneh bagi saya.
Saat menjalankan ini di bash:
find . -iname 'test' | while IFS='\n' read item; do mv $item $(echo $item | tr [:upper:] [:lower:]); done
Dan sumber dan target tidak berubah untuk mv, saya mendapatkan kesalahan berikut:
mv: cannot move '.test' to a subdirectory of itself, './test/test'
Dimana ./test/test berasal dari? Saat gema bukannya mengeksekusi mv, saya mengerti mv ./test ./test. Saya menguji ini pada FreeBSD 10 dan Debian 8.2.0 dengan hasil yang sama. Apa yang saya lewatkan?
./* berbeda dari .? ./* akan memperluas ke setiap item dalam direktori sementara . akan mengambil direktori saat ini, tetapi pada akhirnya itu masih bergerak dalam direktori yang sama. Mari ambil direktori dir misalnya yang berisi 5 direktori a, b, c, d dan e. Jika saya ingin mengganti nama semua subdirektori dari dir, find . dan find ./* akan mengembalikan hasil yang sama.
dir.
-iname test tidak cocok .test; sudah jelas dari hasil kedua (dengan gema) bahwa itu benar-benar ./test dan hanya salah kutip. -ilname persis sama dengan -iname kecuali untuk tautan simbolis yang tidak terlibat di sini. ./* biasanya diperluas ke semua entri di . KECUALI mereka yang memulai . (dot), meskipun beberapa shell memiliki opsi untuk mengubahnya, di bash shopt -s dotglob. OTOH find . akan selalu terlihat seperti dotnames ./.profile (Selain daripada . dan .. ), meskipun di sini nama seperti itu tidak cocok dengan -iname.