Mentre uso BASH da diversi anni, la mia esperienza con gli script BASH è relativamente limitata.
Il mio codice è come di seguito. Dovrebbe prendere l'intera struttura di directory dall'interno della directory corrente e replicarla in $OUTDIR
.
for DIR in `find . -type d -printf "\"%P\"\040"`
do
echo mkdir -p \"${OUTPATH}${DIR}\" # Using echo for debug; working script will simply execute mkdir
echo Created $DIR
done
Il problema è che ecco un esempio della mia struttura di file:
$ ls
Expect The Impossible-Stellar Kart
Five Iron Frenzy - Cheeses...
Five Score and Seven Years Ago-Relient K
Hello-After Edmund
I Will Go-Starfield
Learning to Breathe-Switchfoot
MMHMM-Relient K
Nota gli spazi: -S E for
accetta i parametri parola per parola, quindi l'output del mio script è simile al seguente:
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Learning"
Created Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot"
Created Breathe-Switchfoot
Ma ne ho bisogno per prendere interi nomi di file (una riga alla volta) dall'output di find
. Ho anche provato a find
mettere virgolette doppie attorno a ciascun nome file. Ma questo non aiuta.
for DIR in `find . -type d -printf "\"%P\"\040"`
E output con questa linea modificata:
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"""
Created ""
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"Learning"
Created "Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot""
Created Breathe-Switchfoot"
Ora, ho bisogno di un modo per poter scorrere in questo modo, perché desidero anche eseguire un comando più complicato che coinvolge gstreamer
ogni file in una struttura simile seguente. Come dovrei farlo?
Modifica: ho bisogno di una struttura di codice che mi permetta di eseguire più righe di codice per ogni directory / file / loop. Scusa se non ero chiaro.
Soluzione: inizialmente ho provato:
find . -type d | while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done
Questo ha funzionato bene per la maggior parte. Tuttavia, in seguito ho scoperto che, poiché la pipe risulta in esecuzione nel ciclo while in una subshell, tutte le variabili impostate nel ciclo non sono state successivamente disponibili, il che ha reso piuttosto difficile l'implementazione di un contatore di errori. La mia soluzione finale (da questa risposta su SO ):
while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done < <(find . -type d)
Questo in seguito mi ha permesso di incrementare condizionalmente le variabili all'interno del ciclo che sarebbero rimaste disponibili più avanti nello script.
/
non stampabili. Ma tutto è permesso tranne /
e \0
quindi è necessario consentirli.