Embora eu tenha usado BASH por 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 dentro do diretório atual e replicá-la em $OUTDIR
.
for DIR in 'find . -type d -printf "\"%P\"0"'
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 for
recebe parâmetros palavra por palavra, portanto, a saída do meu script é algo assim:
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 dele para pegar nomes de arquivos inteiros (uma linha de cada vez) da saída de find
. Eu também tentei fazer com que find
colocasse aspas duplas em torno de cada nome de arquivo. Mas isso não ajuda.
for DIR in 'find . -type d -printf "\"%P\"0"'
E saída com essa 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 alguma maneira que eu possa iterar assim, porque eu também quero executar um comando mais complicado envolvendo gstreamer
em cada arquivo em uma estrutura similar a seguir. Como eu deveria estar fazendo 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 estava claro.
Solução: tentei inicialmente:
find . -type d | while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done
Isso funcionou bem na maior parte. No entanto, descobri mais tarde que, como os resultados do pipe no loop while estão sendo executados em um subshell, as variáveis configuradas no loop ficaram indisponíveis posteriormente, o que dificultou bastante a implementação de um contador de erros. Minha solução final (de esta resposta em SO ):
while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done < <(find . -type d)
Isso mais tarde me permitiu incrementar condicionalmente as variáveis dentro do loop, que permaneceriam disponíveis mais tarde no script.