2017-06-28 8 views
0

私は入力ファイルに以下のディレクトリを記述しましたが、ループで作成する必要があります。入力ファイルからディレクトリを作成する

データ/ app_rt_ws /要求/ 2017_06_27
データ/ app_rt_ws /応答/ 2017_06_19
データ/ app_rt_ws/RTWS
データ/ app_rt_ws/SDP
データ/エッジ/応答/ 2016年9月20日
データ/ edge/response/9-22-2016

問題は、サーバ上で実行時に作成されるyyyy_mm_ddまたはdd-mm-yyyy形式のディレクトリは必要ありません。私はそれらを破棄し、残りのディレクトリの静的パスを作成する必要があります。私は以下の使用しています

は、コードを言及したが、上記の日付を取り除くために、bashの文字列置換を使用することができます一部

for i in `cat /tmp/inputfile.txt` 
do 
echo $i 
cd /opt/app/app 
awk '/date_year/{print $1}' (need to filter out the entries with date) 
mkdir -p $i (need to create rest of the directories) 
done 
+0

入力ファイルの日付の形式が一貫していません。それは201Xだけを使用して年を区別することは可能ですか?あなたの場合、dd-mm-yyyyはmm-dd-yyyyでなければなりません。右? – CWLiu

+0

そして、日付のない行がありますが、両方からディレクトリを作成したいというのは正しいですか? – JFS31

+0

@CWLiu日付形式が一貫していません。それが生産の道なのです。私は 'cat /tmp/inputfile.txt | grep -v [0-9] $ 'を実行すると、日付が記載されたエントリが除外されます。 –

答えて

0

を言及を省略する方法を見つけ出すように見えることはできません。

for i in `cat /tmp/inputfile.txt` 
do 
echo $i 
cd /opt/app/app 
if [[ $i =~ [0-9] ]]; then 
mkdir -p ${i%/*} 
else 
mkdir -p $i 
fi 
done 

最後の日付の後のすべてが切り捨てられ、日付が消えます。

あなただけの数字なしですべてのものをしたい場合は、あなたが行うことができます:番目のバージョンの

for i in `cat /tmp/inputfile.txt` 
do 
echo $i 
cd /opt/app/app 
if [[ $i =~ [0-9] ]]; then 
: 
else 
mkdir -p $i 
fi 
done 

出力:

data/app_rt_ws/RTWS 
data/app_rt_ws/SDP 

私は、これはあなたが:)

のために見えたものであると思います
+0

のエントリを保持する必要があります。 – CWLiu

+0

そうです。しかし、入力に関して私はそれが働いて与えられた。 – JFS31

+0

しかし、私はそれをより堅牢にする良いアイデアを持っている場合私はそれを行います:) – JFS31

0

あなたはスクリプトを次のように変更することができます。

for i in `awk '$0 !~ (/[0-9]{1,2}-[0-9]{1,2}-20[0-9]{2}/ && /20[0-9]{2}_[0-9]{1,2}_[0-9]{1,2}/){print}' inputfile.txt`; 
do 
    echo $i 
    cd /opt/app/app 
    mkdir -p $i 
done 
正規表現マッチングのためのbashで

そしてawkコマンドの出力は次のようである、

$ awk '$0 !~ (/[0-9]{1,2}-[0-9]{1,2}-20[0-9]{2}/ && /20[0-9]{2}_[0-9]{1,2}_[0-9]{1,2}/){print}' inputfile.txt 
data/app_rt_ws/RTWS 
data/app_rt_ws/SDP 
+0

シェルの基礎:1)廃止されたバッククックを使用してコマンドを実行しないでください。代わりに '$(command)'を使用してください。 2)設定ファイル名をループするために 'for $(command)'を使わないでください。代わりに 'IFS = read -r i'を使ってください。 3)シェル変数は 'echo $ i'を引用符で囲まないでください。必ず' echo "$ i" 'の代わりに引用符で囲みます。これらは絶対に基本的なシェルプログラミングルールです。詳しくはシェルプログラミングイントロを参照してください。 –

+1

これらのヒントのおかげで、私はこれらの貴重な情報を念頭に置いていきます。 – CWLiu

0

:あなたがテストされ、その結果に満足しているしたら

$ cat tst.sh 
while IFS= read -r path; do 
    if [[ $path =~ /([0-9]{4}(_[0-9]{2}){2}|([0-9]{1,2}-){2}[0-9]{4})$ ]]; then 
     path="${path%/*}" 
    fi 
    echo mkdir -p "$path" 
done < "$1" 

$ ./tst.sh file 
mkdir -p data/app_rt_ws/Request 
mkdir -p data/app_rt_ws/Response 
mkdir -p data/app_rt_ws/RTWS 
mkdir -p data/app_rt_ws/SDP 
mkdir -p data/edge/response 
mkdir -p data/edge/response 

echoを削除します。あなたはdd-mm-yyyyと一致させたいと言っていましたが、あなたの入力にd-mm-yyyyと入力したので、本当に欲しいものがあるので、1桁または2桁で満足していると推測したので、[0-9]{1,2}です。

他のシェルでは、ケースステートメントなどを使用して、行末の日付をグロビンパターンとして一致させます。このチェックを行うために外部ツールを呼び出す必要はありません。

echo $i 

は次のとおりです。使用

some commandの出力にスペースが含まれている場合、それが壊れると、それは非推奨バッククォートの代わりに、近代的な表記法$(some command)を使用して、とやっているので

for i in `some command` 

は回避することが常にあります偶発的な単語の分割やファイル名の生成を避ける特別な理由がない限り、常にシェル変数(echo "$i")を引用する必要があるため、常に避けるべきです。

関連する問題