Si bien he estado usando BASH durante varios años, mi experiencia con las secuencias de comandos BASH es relativamente limitada.
Mi código es el siguiente. Debe tomar toda la estructura de directorios desde el directorio actual y replicarla en $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
El problema es que aquí hay una muestra de la estructura de mi archivo:
$ 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
Tenga en cuenta los espacios: -S Y for
toma los parámetros palabra por palabra, por lo que la salida de mi script se ve así:
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
Pero lo necesito para tomar nombres de archivos completos (una línea a la vez) de la salida de find
. También he intentado hacer find
poner comillas dobles alrededor de cada nombre de archivo. Pero esto no ayuda.
for DIR in `find . -type d -printf "\"%P\"\040"`
Y salida con esta línea cambiada:
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"
Ahora, necesito alguna forma en la que pueda iterar de esta manera, porque también deseo ejecutar un comando más complicado que involucre gstreamer
a cada archivo en una estructura similar. ¿Cómo debería estar haciendo esto?
Editar: Necesito una estructura de código que me permita ejecutar múltiples líneas de código para cada directorio / archivo / bucle. Lo siento si no estaba claro.
Solución: inicialmente intenté:
find . -type d | while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done
Esto funcionó bien en su mayor parte. Sin embargo, más tarde descubrí que, dado que la tubería da como resultado que el bucle while se ejecute en una subshell, las variables establecidas en el bucle no estuvieron disponibles más tarde, lo que dificultó la implementación de un contador de errores. Mi solución final (de esta respuesta en SO ):
while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done < <(find . -type d)
Esto más tarde me permitió incrementar condicionalmente las variables dentro del ciclo que permanecerían disponibles más adelante en el script.
/
caracteres no imprimibles. Pero todo está permitido excepto /
y, \0
por lo tanto, debe permitirlos.