Il for
-loop ripeterà ogni voce (separata da spazi) sulla stringa fornita.
In realtà non esegui il find
comando, ma forniscilo come stringa (che viene ripetuta dal for
-loop).Invece delle doppie virgolette usa i backtick o $()
:
for line in $(find . -iname '*.txt'); do
echo "$line"
ls -l "$line"
done
Inoltre, se i percorsi/nomi dei file contengono spazi, questo metodo fallisce (poiché il file for
-loop itera su voci separate da spazi). Invece è meglio usare il metodo descritto nella risposta di dogbanes.
Per chiarire il tuo errore:
Come detto, for line in "find . -iname '*.txt'";
itera su tutte le voci separate da spazi, che sono:
- trova
- .
- -iname
- '*.txt' (credo...)
I primi due non generano un errore (oltre al comportamento indesiderato), ma il terzo è problematico in quanto esegue:
ls -l -iname
Molti comandi (bash) possono combinare opzioni a carattere singolo, quindi -iname
è uguale a -i -n -a -m -e
. E voilà:il tuo invalid option -- 'e'
errore!
Ecco un modo migliore per scorrere i file in quanto gestisce gli spazi e le nuove righe nei nomi dei file:
#!/bin/bash
find . -type f -iname "*.txt" -print0 | while IFS= read -r -d $'\0' line; do
echo "$line"
ls -l "$line"
done
Usa la sostituzione di comando invece delle virgolette per eseguire find invece di passare il comando come stringa:
for line in $(find . -iname '*.txt'); do
echo $line
ls -l $line;
done
Versione più compatta che funziona con spazi e newline nel nome del file:
find . -iname '*.txt' -exec sh -c 'echo "{}" ; ls -l "{}"' \;