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 for
utiliza 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 find
colocar 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 gstreamer
cada 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, \0
portanto, você deve permitir.