Quando ho provato a convertire alcuni file in lettere minuscole ho notato qualcosa che mi sembra strano.
Quando si esegue questo in bash:
find . -iname 'test' | while IFS='\n' read item; do mv $item $(echo $item | tr [:upper:] [:lower:]); done
E l'origine e la destinazione sono invariate per mv, ottengo il seguente errore:
mv: cannot move '.test' to a subdirectory of itself, './test/test'
Da dove ./test/test
viene? Quando echo invece di eseguire mv, ottengo mv ./test ./test
. Ho provato questo sia su FreeBSD 10 che su Debian 8.2.0 con gli stessi risultati. Cosa mi sto perdendo?
./*
differisce .
? ./*
si espanderà a ciascun elemento nella directory mentre .
prenderà la directory corrente, ma alla fine si sposta ancora all'interno della stessa directory. Prendiamo la directory dir
, ad esempio, che contiene 5 directory a
, b
, c
, d
e e.
se voglio cambiare titolo tutte le sottodirectory di dir
, find .
e find ./*
restituirà lo stesso risultato.
dir
.
-iname test
non corrisponde .test
; è chiaro dal secondo risultato (con l'eco) che è veramente ./test
e solo citato male. -ilname
è esattamente lo stesso ad -iname
eccezione dei collegamenti simbolici che non sono coinvolti qui. ./*
normalmente si espande a tutte le voci in .
EXCEPT quelle che iniziano con .
(punto), anche se alcune shell hanno un'opzione per cambiarlo, in bash
shopt -s dotglob
. OTOH find .
guarderà sempre i nomi di punti come ./.profile
(diversi da .
e ..
), anche se qui un tale nome non corrisponde al -iname
.