Spazio nel nome della cartella all'interno di un ciclo FIND

4

Sto lavorando su uno script che ha bisogno di leggere i file all'interno di un ciclo FIND. Qualcosa del genere:

DIRINI=/Volumes/dados/App\ Data/DATABASE.noindex/30000
for FILE  in 'find "$DIRINI"  -type f ' ; do
stat $FILE
stat "$FILE"
stat '$FILE'
done

Il problema è: quando il foldername ha uno spazio dentro, devo mettere la var $ DIRINI all'interno di un "" e questo fa funzionare FIND, ma gli altri comandi all'interno del ciclo che usano $ DIRINI non funzionano, si dividono nome della cartella in due usa la metà in ogni ciclo.

Qualcuno ha un'idea di cosa posso fare? Grazie in anticipo

    
posta Vilefort 12.04.2018 - 14:16
fonte

2 risposte

1

Questo è un classico esempio con la shell che esegue la divisione delle parole. Quando assegni una variabile con spazi, il valore deve essere quotato, ad esempio var="foo bar" . Quando la variabile var è espansa sul lato destro di un comando, la variabile deve essere quotata o la shell divide la variabile in due o più argomenti.

Quando si utilizza la sostituzione di comando in un ciclo for , la sostituzione di comando viene espansa come risultati delimitati nello spazio. Così,

for line in 'find dir -type f'

si espande in

for line in filename with spaces filename file name with spaces

ogni parola diventa un argomento invece dei nomi di file effettivi.

Soluzione 1: è il pipe dei risultati di find in un ciclo while read:

find "$DIRINI"  -type f | while IFS= read -r line; do
    command "$line"
    command "$line"
done

Soluzione 2: utilizzare la sostituzione del processo con un ciclo di lettura while:

while IFS= read -r line; do
    command "$line"
    command "$line"
done < <(find "$DIRINI"  -type f)

Soluzione 3: usa find find:

find "$DIRINI"  -type f -exec command {} \; -exec command {} \;
    
risposta data 12.04.2018 - 16:10
fonte
5

Non eseguire il loop dei risultati di find, ci sono troppe cose che possono andar male. Usa

find "$DIRINI" -type f -exec stat {} \;

o

find "$DIRINI" -type f -print0 | xargs -0 stat

, invece.

    
risposta data 12.04.2018 - 14:34
fonte

Leggi altre domande sui tag