2016-03-30 10 views
1

Ich habe ein Bash-Skript, das eine Mischung aus Vorlagendateien und Daten verwendet, die hierarchisch in einem Verzeichnis mit dem Namen INPUT angeordnet sind.Befehlszeilentool in Bash zum Erstellen von Verzeichnisbaum?

Das Skript führt Folgendes aus:

  1. Erstellt eine hierarchische Struktur Dateiausgabe, OUTPUT
  2. Füllt den Dateibaum mit gefiltertem/nachverarbeiteten Daten.
  3. Führt einige externe Programme für die Visualisierung usw. dieser Daten aus.

Da ich dieses Skript möge möglichst portabel sein und macht es einfach für die Kollegen es zu laufen, ich will nicht von außen die OUTPUT Ordnerstruktur Premake, ich will es on the fly generieren.

Leider schafft dies einen großen Text glob.

Zur Zeit habe ich so etwas wie:

$!/bin/bash 

function MkdirAndAssign() { mkdir -p $1; echo $1; } 

baseDir=$(pwd) 
outDir=$(MkdirAndAssign ${baseDir}/OUTPUT) 
outTop1Dir=$(MkdirAndAssign ${outDir}/TOP1) 
outMid1_1Dir=$(MkdirAndAssign ${outTop1Dir}/MID1_1) 
outMid1_2Dir=$(MkdirAndAssign ${outTop1Dir}/MID1_2) 
outMid1_3Dir=$(MkdirAndAssign ${outTop1Dir}/MID1_3) 
outBottom1_3_1Dir=$(MkdirAndAssign ${outMid1_3Dir}) 
outTop2Dir=$(MkdirAndAssign ${outDir}/TOP2) 
outTop3Dir=$(MkdirAndAssign ${outDir}/TOP3) 
outMid3_1Dir=$(MkdirAndAssign ${outTop1Dir}/MID3_1) 
outMid3_2Dir=$(MkdirAndAssign ${outTop1Dir}/MID3_2) 

Natürlich das sind nur Verzeichnisnamen aus ... meine wirklichen tatsächlichen Bedeutung haben ... aber das Wichtigste ist, ich bin den Aufbau dieser großen Satz verschachtelter Verzeichnisse.

Meine Frage:

Gibt es irgendeine Art von Shell-Befehl, der diese kürzer und süßer machen kann ??

(Anmerkung meine Funktion im Grunde wickelt nur mkdir -p so, dass ich eine variable Zuordnung in einem Befehl bekommen, für eine spätere Wiederverwendung.)

+2

Leider, ich glaube nicht, dass es ein anderes Werkzeug irgendwo versteckt, das machen würde es ist einfacher. Wenn Sie im laufenden Betrieb erstellen, ist die einzige andere Option, die ich sehe, ein Schema, in dem Sie die generierten Pfadkomponenten in einem Array (oder einem assoziativen Array) enthalten, das Sie dann in einem Schleifenschema zum Erstellen der Verzeichnisstruktur verwenden können habe die benötigten Daten. Ehrlich gesagt hört sich das nicht nach viel Nutzen an, aber es kann Dinge aufräumen, abhängig von Ihrer endgültigen Schleifenlogik (oder es noch schlimmer machen ...) Viel Glück. –

+1

Schließen können Sie erhalten 'mkdir -p $ (pwd)/AUSGABE/TOP1/MID1_ {1,2,3} $ (pwd)/AUSGABE/TOP2 $ (pwd)/OUTPUT/TOP3/MID1_ {1,2} ' – 7171u

+0

Ah, das ist clever/handy @ 7171u! Kannst du es zur Lösung bringen? Es bringt mich nah genug dahin, wo ich den Rest ausarbeiten kann ... möchte dir Kredit geben. –

Antwort

1

Es gibt einen Parameter Expansion, die alle Namen von Vars auflistet, die einige preffix haben:

${[email protected]} 

Wenn wir die Namen der Variablen ändern zu einem gewissen einheitlichen Format verwendet, und sortieren sie in der Reihenfolge, wie sie erstellt werden müssen, wird dies Ihr Problem lösen:

#!/bin/bash 
outDir=$(pwd) 
outDir01=${outDir}/OUTPUT 
outDir02=${outDir01}/TOP1 
outDir03=${outDir02}/MID1_1 
outDir04=${outDir02}/MID1_2 
outDir05=${outDir02}/MID1_3 
outDir06=${outDir05}/BOT_1 
outDir07=${outDir01}/TOP2 
outDir08=${outDir01}/TOP3 
outDir09=${outDir02}/MID3_1 
outDir10=${outDir02}/MID3_2 

for d in "${[email protected]}"; do 
    [[ $d == outDir ]] && continue 
    if [[ -e "${!d}" ]]; then 
     [[ -f "${!d}" ]] && echo "A file named ${!d} exist" 
     [[ -d "${!d}" ]] && echo "A directory named ${!d} already exist" 
     exit 2 
    else 
     echo \ 
     mkdir "${!d}" 
     if [[ $? != 0 ]]; then 
      echo "mkdir was unable to create ${!d}" 
      exit 3 
     fi 
    fi 
done 

Das Skript hat eine echo \ für Sie zu sehen, was es tun wird. Wenn Sie den aufgeführten Aktionen zustimmen, kommentieren Sie diese Zeile (fügen Sie eine : # echo \ hinzu).


aber der einfachste Weg, um all dies zu tun ist (aber ziemlich schwieriger zu warten):

$ mkdir -p ./OUTPUT/TOP{1/MID{1_{1,2,3/BOT_1},3_{1,2}},2,3} 
$ tree OUTPUT/ 
OUTPUT/ 
├── TOP1 
│   ├── MID1_1 
│   ├── MID1_2 
│   ├── MID1_3 
│   │   └── BOT_1 
│   ├── MID3_1 
│   └── MID3_2 
├── TOP2 
└── TOP3