2011-02-04 12 views
9

In uno script bash, voglio scorrere tutte le directory nella presente directory di lavoro e fare roba a loro. Possono contenere simboli speciali, specialmente spazi bianchi. Come lo posso fare? Ho:Ciclo su directory con spazi in Bash

for dir in $(ls -l ./) 
do 
    if [ -d ./"$dir" ] 

ma questo salta le mie directory con spazi bianchi nel loro nome. Qualsiasi aiuto è apprezzato.

risposta

24

dare una prova:

for dir in */ 
+0

questo, ma perché? */è un jolly per tutte le directory? – jakev

+1

Wow, funziona davvero, anche su directory con spazi. Quindi, bash deve citare implicitamente i valori quando espande il carattere jolly? Lo adoro. – harpo

+0

@JakeVA: Sì, esattamente. Nota che non includerà le directory nascoste se non imposti 'shopt -s dotglob'. Se la directory corrente potrebbe non avere sottodirectory, dovresti anche impostare 'shopt -s nullglob' (impostalo per ogni evenienza). –

8

fare la vostra scelta di soluzioni:

http://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html

L'idea generale è quella di modificare il separatore di default (IFS).

#!/bin/bash 
SAVEIFS=$IFS 
IFS=$(echo -en "\n\b") 
for f in * 
do 
    echo "$f" 
done 
IFS=$SAVEIFS 
+0

Ho dimenticato di menzionarlo nella mia domanda, ma ci ho provato. Penso che il pezzo mancante stava iterando su * o */piuttosto che sui risultati di ls – jakev

+0

ho trovato la mia soluzione qui, usando 'find. -print0 | mentre leggi -d $ '\ 0' file' per impostare un ciclo 'do' con la variabile' file'. – Air

3

Esistono diversi modi. Qui è qualcosa che è molto veloce:

find /your/dir -type d -print0 | xargs -0 echo 

Questo esegue la scansione/vostro/dir ricorsivamente per le directory e passerà tutti i percorsi al comando "echo" (centralino al bisogno). Può chiamare echo a più riprese, ma proverà a passare tanti nomi di directory come consente la console in una sola volta. Questo è estremamente veloce perché alcuni processi devono essere avviati. Ma funziona solo su programmi che possono assumere una quantità arbitraria di valori come opzioni. -print0 dice a trovare per i percorsi dei file separati utilizzando un byte zero (e -0 dice xargs a leggere argomenti separati da zero byte) Se non si dispone di quella successiva, è possibile fare questo:

find /your/dir -type d -print0 | xargs -0 -n 1 echo 

o

find /your/dir -type d -print0 --exec echo '{}' ';' 

l'opzione -n ​​1 dirà xargs non passare più argomenti di un allo stesso tempo al vostro programma. Se non si desidera che find esegua la scansione in modo ricorsivo, è possibile specificare l'opzione di profondità per disabilitare la ricorsione (non conoscendo la sintassi a memoria).

Anche se questo è utilizzabile nella tua particolare sceneggiatura è un'altra domanda ;-).

+0

Nota che xargs ha strumenti aggiuntivi che sono utili qui, come -J . Esempio: xargs -0 -J% mv% ~/some_other_folder –

Problemi correlati