2016-03-30 3 views
1

私はテンプレートファイルと、ディレクトリINPUTに階層的にレイアウトされたデータが混在するbashスクリプトを持っています。ディレクトリツリーを構築するためのBashのコマンドラインツール

スクリプトは次のない:

  1. 階層ファイル出力構造を作成し、OUTPUT
  2. 移入は、後処理/フィルタ処理されたデータのファイルツリーと述べました。
  3. 上記のデータの可視化などのために、いくつかの外部プログラムを実行します。

私は、このスクリプトは、できるだけ移植可能にし、それが簡単に同僚がそれを実行できるようにするためにしたいと、私は外部OUTPUTフォルダ構造をpremakeしたくない、私はその場でそれを生成したいです。

残念ながら、これは大きなテキストグロブを作成します。ちょうどディレクトリ名は...私の本当のものは実際の意味を持って作られたもの。もちろん、

$!/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) 

...しかし、重要なことは、私はこの大きなセットを構築しています:

は、現在、私のようなものを持っていますネストされたディレクトリの

私の質問:

が、これは短く、甘くすることができますシェルコマンドのいくつかの並べ替えはあります?

(私の機能は、基本的にはちょうど私が後で再利用のための1つのコマンドで変数の割り当てを、得ることができるようmkdir -pをラップします。)

+2

残念ながら、私はなるだろうどこかに隠れて他のツールがあるとは思いませんそれはより簡単です。オンザフライで作成している場合は、生成されたパスコンポーネントを配列(または連想配列)に保持するスキームがあります。この配列をループスキームで使用して、必要なデータを持っている。正直言って、それは多くの利点のようには聞こえませんが、最終的なループのロジックに応じて整理することができます(または悪化させる...)幸運。 –

+1

'mkdir -p $(pwd)/ OUTPUT/TOP1/MID1_ {1,2,3} $(pwd)/ OUTPUT/TOP2 $(pwd)/ OUTPUT/TOP3/MID1_ {1,2} ' – 7171u

+0

ああ、それは賢い/便利な@ 7171uです!あなたはそれを解決することができますか?それは、私が残りの部分を取り組むことができるところまで私を十分に近づけます...あなたに信用を与えることを望みます。 –

答えて

1

一部preffixを持っているVARSのすべての名前を一覧表示パラメータ展開があります:

#!/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 
${[email protected]} 

我々はいくつかの均一なフォーマットに使用される変数の名前を変更し、それらが作成する必要があるために、それらを並べ替える場合、これはあなたの問題を解決します

スクリプトの実行内容を確認するためのecho \があります。リストされたアクションに同意する場合は、その行をコメントアウトしてください(## echo \を追加してください)。


しかし、このすべてを行う最も簡単な方法がある(ただし、維持することは非常に多くの困難):

$ 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 
関連する問題