3 votes

Shell script pour créer plusieurs répertoires

J'essaie de créer une hiérarchie de fichiers pour stocker des données. Je veux créer un dossier pour chaque session d'acquisition de données. Ce dossier a cinq sous-dossiers, qui sont nommés ci-dessous. Ma tentative de code ci-dessous donne une erreur, mais je ne sais pas comment la corriger.

Code

 #!/bin/sh
 TRACES = "/Traces"
 LFPS = '/LFPS'
 ANALYSIS = '/Analysis' 
 NOTES = '/Notes'
 SPIKES = '/Spikes'

 folders=($TRACES $LFPS $ANALYSIS $NOTES $SPIKES)
 for folder in "${folders[@]}"
  do
    mkdir $folder
  done

Erreur J'obtiens une erreur lors de la déclaration des variables. Comme écrit ci-dessus, bash renverse l'erreur Command not found . Si, au lieu de cela, je déclare les noms de fichiers comme étant TRACES = $('\Traces') , bash retourne l'erreur No such file or directory .

7voto

mata Points 22446

Supprimez les espaces entre les noms de variables et les valeurs :

#!/bin/sh
TRACES="/Traces"
LFPS='/LFPS'
ANALYSIS='/Analysis' 
NOTES='/Notes'
SPIKES='/Spikes'

folders=($TRACES $LFPS $ANALYSIS $NOTES $SPIKES)
for folder in "${folders[@]}"
 do
   mkdir $folder
 done

Avec des espaces, bash interprète cela comme

COMMAND param1 param2

avec = como param1

5voto

Jonathan Leffler Points 299946

Je prends la partie "pas d'espaces autour des assignations de variables" de la correction comme donnée.

L'utilisation de la notation de tableau semble exagérée. En tenant compte des espaces éventuels dans les noms, vous pouvez utiliser :

for dir in "$TRACE" "$LFPS" "$NOTES" "$PASS"
do mkdir "$dir"
done

Mais même ça, c'est du gaspillage :

mkdir "$TRACE" "$LFPS" "$NOTES" "$PASS"

Si vous craignez que les répertoires puissent exister, vous pouvez éviter les messages d'erreur à ce sujet :

mkdir -p "$TRACE" "$LFPS" "$NOTES" "$PASS"

El -p est également utile si les chemins sont plus longs et que certains des répertoires intermédiaires peuvent être manquants. Si vous êtes sûr qu'il n'y aura pas d'espaces dans les noms, les guillemets doubles deviennent optionnels (mais ils sont sûrs et bon marché, donc vous pouvez aussi les utiliser).

3voto

Danila Ladner Points 601

Vous pouvez également vérifier à l'avance si les dossiers existent ou non. De plus, vous pouvez toujours déboguer le shell script avec set -x, vous pourriez juste utiliser "mkdir -p" qui ferait l'affaire.

2voto

Rob Kielty Points 3274

J'ai fait les changements suivants pour que votre script s'exécute.

À titre de commentaire, il est inhabituel de créer de tels dossiers suspendus au système de fichiers racine.

#!/bin/sh
TRACES="/Traces"
LFPS='/LFPS'
ANALYSIS='/Analysis'
NOTES='/Notes'
SPIKES='/Spikes'

folders="$TRACES $LFPS $ANALYSIS $NOTES $SPIKES"
for folder in $folders
do
   mkdir $folder
done

Les espaces ont été supprimés des affectations initiales des variables et j'ai également simplifié la boucle for de manière à ce qu'elle itère sur les mots dans le fichier folders chaîne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X