Enquanto uso o BASH há vários anos, minha experiência com scripts BASH é relativamente limitada.
Meu código é como abaixo. Ele deve pegar toda a estrutura de diretórios de dentro do diretório atual e replicá-la para $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
O problema é que, aqui está uma amostra da minha estrutura de arquivos:
$ 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
Observe os espaços: -S E forutiliza parâmetros palavra por palavra, para que a saída do meu script seja algo como isto:
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
Mas eu preciso que ele pegue nomes de arquivos inteiros (uma linha de cada vez) da saída de find. Eu também tentei findcolocar aspas duplas em torno de cada nome de arquivo. Mas isso não ajuda.
for DIR in `find . -type d -printf "\"%P\"\040"`
E saída com esta linha alterada:
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"
Agora, eu preciso de uma maneira que possa iterar dessa maneira, porque também desejo executar um comando mais complicado envolvendo gstreamercada arquivo em uma estrutura semelhante a seguir. Como devo fazer isso?
Edit: Eu preciso de uma estrutura de código que me permita executar várias linhas de código para cada diretório / arquivo / loop. Desculpe se eu não era clara.
Solução: inicialmente tentei:
find . -type d | while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done
Isso funcionou bem na maior parte do tempo. No entanto, descobri mais tarde que uma vez que os resultados de tubos no circuito durante a execução em um subnível, quaisquer variáveis definidas no circuito foram mais tarde indisponíveis que fez implementar um contador de erros bastante difícil. Minha solução final ( desta resposta no SO ):
while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done < <(find . -type d)
Isso mais tarde me permitiu incrementar condicionalmente variáveis dentro do loop, que permaneceriam disponíveis posteriormente no script.
/caracteres imprimíveis. Mas tudo é permitido, exceto /e, \0portanto, você deve permitir.