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/testviene? 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, de e.se voglio cambiare titolo tutte le sottodirectory di dir, find .e find ./*restituirà lo stesso risultato.
dir.
-iname testnon corrisponde .test; è chiaro dal secondo risultato (con l'eco) che è veramente ./teste solo citato male. -ilnameè esattamente lo stesso ad -inameeccezione 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.