Ho uno script di shell bash che esegue il ciclo di tutte le directory figlio (ma non dei file) di una determinata directory. Il problema è che alcuni dei nomi di directory contengono spazi.
Ecco i contenuti della mia directory di test:
$ls -F test
Baltimore/ Cherry Hill/ Edison/ New York City/ Philadelphia/ cities.txt
E il codice che scorre nelle directory:
for f in `find test/* -type d`; do
echo $f
done
Ecco l'output:
test / Baltimora test / Cherry collina test / Edison test / Nuovo York Città test / Philadelphia
Cherry Hill e New York City sono trattate come 2 o 3 voci separate.
Ho provato a citare i nomi dei file, in questo modo:
for f in `find test/* -type d | sed -e 's/^/\"/' | sed -e 's/$/\"/'`; do
echo $f
done
ma inutilmente.
Deve esserci un modo semplice per farlo.
Le risposte di seguito sono ottime. Ma per rendere tutto più complicato, non voglio sempre utilizzare le directory elencate nella mia directory di test. A volte desidero invece passare i nomi delle directory come parametri della riga di comando.
Ho seguito il suggerimento di Charles di impostare l'IFS e ho pensato quanto segue:
dirlist="${@}"
(
[[ -z "$dirlist" ]] && dirlist=`find test -mindepth 1 -type d` && IFS=$'\n'
for d in $dirlist; do
echo $d
done
)
e questo funziona bene a meno che non ci siano spazi negli argomenti della riga di comando (anche se questi argomenti sono tra virgolette). Ad esempio, chiamando lo script in questo modo: test.sh "Cherry Hill" "New York City"produce il seguente output:
ciliegia collina Nuovo York Città
list="$@"scarta completamente la list-ness del valore originale, riducendolo in una stringa. Per favore, segui le pratiche nella mia risposta esattamente come fornite - un tale incarico non è incoraggiato da nessuna parte in essa; se vuoi passare un elenco di argomenti della riga di comando a un programma, dovresti raccoglierli in un array ed espandere quell'array direttamente.