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
.