Bien que j'utilise BASH depuis plusieurs années, mon expérience avec les scripts BASH est relativement limitée.
Mon code est comme ci-dessous. Il doit récupérer l'intégralité de la structure du répertoire à partir du répertoire actuel et la répliquer dans $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
Le problème est, voici un exemple de ma structure de fichiers:
$ 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
Notez les espaces: -S Et for
prend les paramètres mot par mot, donc la sortie de mon script ressemble à ceci:
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
Mais j'en ai besoin pour récupérer des noms de fichiers entiers (une ligne à la fois) de la sortie de find
. J'ai également essayé de find
mettre des guillemets autour de chaque nom de fichier. Mais cela n'aide pas.
for DIR in `find . -type d -printf "\"%P\"\040"`
Et sortie avec cette ligne modifiée:
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"
Maintenant, j'ai besoin d'un moyen que je puisse parcourir comme ceci, car je souhaite également exécuter une commande plus compliquée impliquant gstreamer
chaque fichier dans une structure similaire suivante. Comment dois-je faire cela?
Edit: J'ai besoin d'une structure de code qui me permettra d'exécuter plusieurs lignes de code pour chaque répertoire / fichier / boucle. Désolé si je n'ai pas été clair.
Solution: j'ai d'abord essayé:
find . -type d | while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done
Cela a très bien fonctionné pour la plupart. Cependant, j'ai constaté plus tard que, puisque le canal entraînait l'exécution de la boucle while dans un sous-shell, toutes les variables définies dans la boucle étaient ultérieurement indisponibles, ce qui rendait l'implémentation d'un compteur d'erreurs assez difficile. Ma solution finale (à partir de cette réponse sur SO ):
while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done < <(find . -type d)
Cela m'a plus tard permis d'incrémenter conditionnellement des variables dans la boucle qui resteraient disponibles plus tard dans le script.
/
J'autoriserais tout sauf les caractères non imprimables. Mais tout est permis sauf /
et \0
vous devez donc les autoriser.