Usare l'uscita di ls
per ottenere i nomi dei file è una cattiva idea . Può portare a malfunzionamenti e persino a script pericolosi. Questo perché un nome di file può contenere qualsiasi carattere eccetto /
e il carattere null
, e ls
non usa nessuno di questi caratteri come delimitatori, quindi se un nome di file ha uno spazio o una nuova linea, si _ otterranno risultati inaspettati.
Ci sono due modi molto buoni per iterare sui file. Qui, ho usato semplicemente echo
per dimostrare di fare qualcosa con il nome del file; si può usare qualsiasi cosa, però.
Il primo è usare le caratteristiche di globbing nativo della conchiglia.
for dir in */; do
echo "$dir"
done
La shell espande */
in argomenti separati che il ciclo for
legge; anche se c'è uno spazio, una nuova linea o qualsiasi altro strano carattere nel nome del file, for
vedrà ogni nome completo come un'unità atomica; non sta analizzando la lista in alcun modo.
Se volete andare ricorsivamente nelle sottodirectory, allora questo non funzionerà a meno che la vostra shell non abbia alcune caratteristiche di globbing estese (come bash
di globstar
. Se la vostra shell non ha queste caratteristiche, o se volete assicurarvi che il vostro script funzioni su una varietà di sistemi, allora la prossima opzione è quella di usare find
.
find . -type d -exec echo '{}' \;
Qui, il comando find
chiamerà echo
e gli passerà un argomento del nome del file. Lo fa una volta per ogni file che trova. Come nell'esempio precedente, non c'è l'analisi di una lista di nomi di file; invece, un nome di file viene inviato completamente come argomento.
La sintassi dell'argomento -exec
sembra un po’ buffa. find
prende il primo argomento dopo -exec
e lo tratta come il programma da eseguire, e ogni argomento successivo, lo prende come argomento da passare a quel programma. Ci sono due argomenti speciali che -exec
deve vedere. Il primo è {}
; questo argomento viene sostituito con un nome di file che le parti precedenti di find
generano. Il secondo è ;
, che fa sapere a find
che questa è la fine della lista di argomenti da passare al programma; find
ha bisogno di questo perché si può continuare con più argomenti che sono destinati a find
e non sono destinati al programma eseguito. La ragione di [ Usare l'uscita di
lsper ottenere i nomi dei file è una cattiva idea ]&003. Può portare a malfunzionamenti e persino a script pericolosi. Questo perché un nome di file può contenere qualsiasi carattere eccetto
/e il carattere
null, e
ls` non usa nessuno di questi caratteri come delimitatori, quindi se un nome di file ha uno spazio o una nuova linea, si _ otterranno risultati inaspettati.
Ci sono due modi molto buoni per iterare sui file. Qui, ho usato semplicemente echo
per dimostrare di fare qualcosa con il nome del file; si può usare qualsiasi cosa, però.
Il primo è usare le caratteristiche di globbing nativo della conchiglia.
for dir in */; do
echo "$dir"
done
La shell espande */
in argomenti separati che il ciclo for
legge; anche se c'è uno spazio, una nuova linea o qualsiasi altro strano carattere nel nome del file, for
vedrà ogni nome completo come un'unità atomica; non sta analizzando la lista in alcun modo.
Se volete andare ricorsivamente nelle sottodirectory, allora questo non funzionerà a meno che la vostra shell non abbia alcune caratteristiche di globbing estese (come bash
di globstar
. Se la vostra shell non ha queste caratteristiche, o se volete assicurarvi che il vostro script funzioni su una varietà di sistemi, allora la prossima opzione è quella di usare find
.
find . -type d -exec echo '{}' \;
Qui, il comando find
chiamerà echo
e gli passerà un argomento del nome del file. Lo fa una volta per ogni file che trova. Come nell'esempio precedente, non c'è l'analisi di una lista di nomi di file; invece, un nome di file viene inviato completamente come argomento.
La sintassi dell'argomento -exec
sembra un po’ buffa. find
prende il primo argomento dopo -exec
e lo tratta come il programma da eseguire, e ogni argomento successivo, lo prende come argomento da passare a quel programma. Ci sono due argomenti speciali che -exec
deve vedere. Il primo è {}
; questo argomento viene sostituito con un nome di file che le parti precedenti di find
generano. Il secondo è ;
, che fa sapere a find
che questa è la fine della lista di argomenti da passare al programma; find
ha bisogno di questo perché si può continuare con più argomenti che sono destinati a find
e non sono destinati al programma eseguito. La ragione di è che anche la shell tratta ;
in modo speciale - rappresenta la fine di un comando, quindi dobbiamo sfuggirgli, in modo che la shell lo dia come argomento a find
piuttosto che consumarlo per se stesso; un altro modo per far sì che la shell non lo tratti in modo speciale è metterlo tra virgolette: ';'
funziona altrettanto bene di \;
per questo scopo.