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 dilsper 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 caratterenull, els` 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.