2016-07-06 2 views
0

私はいくつかの検索を行ってきましたが、本当に必要なものを本当に助けたものは見つかりませんでした。.tgzファイル名の一部を削除し、新しく作成したディレクトリに移動してから抽出します。 Bash Shell

私はdirのすべての.tgzファイルの名前を変更し、新しいファイル名を使用してディレクトリを作成し、mv all .tgzファイルをシェル/ bashを使用して新しいディレクトリに作成しようとしています。


例:同じ最終的に全ての.tgz tarファイルを抽出するスクリプトの一部を有する

data/compared/1.0.11to1.0.12/ 
     1.0.11.class.tgz 
     1.0.12.class.tgz 

data/compared/1.0.12to1.0.13/ 
     1.0.12.class.tgz 
     1.0.13.class.tgz 

data/compared/1.0.13to1.0.14/ 
     1.0.13.class.tgz 
     1.0.14.class.tgz 

data/compared/1.0.14to1.0.15/ 
     1.0.14.class.tgz 
     1.0.15.class.tgz 

また、:

初期状態:

data/results/ 
    test_a.1.0.11.class.tgz 
    test_b.1.0.12.class.tgz 
    test_c.1.0.13.class.tgz 
    test_d.1.0.14.class.tgz 
    test_d.1.0.15.class.tgz 

結果状態ディレクトリは素晴らしいでしょう。

例:

データ/比較/ 1.0.14to1.0.15/ 1.0.14.class.tgz 1.0.15.class.tgz /extractedTar1.0.14 /extractedTar1.0.15

ありがとう、すべて!私がこれまで試したどのような


:!あなたは、これは私がすべてで欲しい正確に何をしません見ることができるように

for full_filename in *.tgz; do 
    extension="$full_{filename##*.}" 
    filename="$full_filename%.*}" 
    mkdir -p "$filename" 
    mv "$full_filename" "$filename/" 
done 

/binに/ bashの。



EDIT:追加機能要求! それぞれのtarballは、他の多くのdir /ファイルを格納する単一の(/ test)ディレクトリで構成されています。 など。 1.0.11.class.tgzはそれぞれの "/ test"ディレクトリで構成されています。

抽出された "test"ディレクトリの名前を "test_1.0.11"のように変更してから、誤って他のtarballを同じ "test"ディレクトリに展開するよう注意しながら、これらの各tarballを抽出する方法はありますか?ありがとう、トン!

+1

試しましたか? – 123

+0

これまでに試したことの上の投稿に編集を追加します。 – TNKaf

+0

私は何を試してみましたか? – TNKaf

答えて

0

私はtarballがフラットなファイル構造(ディレクトリなし)を持っていて、あなたが "data"ディレクトリにいると仮定します。

あなたは "mv all .tgz files to new directories"と言っていますが、 "RESULT STATE"の例ではこれらのファイルのうち2つがあります。私はあなたが "cp"(コピー)を意味すると仮定します。コピーして移動したい場合は、コメントに記されているように、2番目のcp行をmvに変更してください。

#!/bin/sh 
last= 
for tgz in results/*.tgz; do   # loop on all .tgz files in results/ 
    if [ -n "$last" ]; then 
    target="compared/${last#*.}"  # e.g. compared/1.0.11.class.tgz 
    target="${target%.*.*}to${tgz#*.}" # e.g. compared/1.0.11to1.0.12.class.tgz 
    target="${target%.*.*}"   # e.g. compared/1.0.11to1.0.12 
    mkdir -p "$target" 
    cp -p "$last" "$target/${last#*.}" # skips "test_a." prefix 
    cp -p "$tgz" "$target/${tgz#*.}" # change this to mv to move 
    fi 
    last="$tgz" 
done 

元:

$ ls -1R results 
results: 
test_a.1.0.11.class.tgz 
test_b.1.0.12.class.tgz 
test_c.1.0.13.class.tgz 
test_d.1.0.14.class.tgz 
test_d.1.0.15.class.tgz 

出力:

$ ls -1R compared/* 
compared/1.0.11to1.0.12: 
1.0.11.class.tgz 
1.0.12.class.tgz 

compared/1.0.12to1.0.13: 
1.0.12.class.tgz 
1.0.13.class.tgz 

compared/1.0.13to1.0.14: 
1.0.13.class.tgz 
1.0.14.class.tgz 

compared/1.0.14to1.0.15: 
1.0.14.class.tgz 
1.0.15.class.tgz 
については

"追加機能要求は、" 第二cpコマンドの後に次の行を追加します。

​​

(注、これはtar --helpしかしないman tarに記載されてい-C DIRためのGNUのtarが必要です。)

あなたがcpコマンドを削除、tarballを必要としない場合。

+0

素晴らしい、絶対に優れています。私の感謝します。はい、あなたは正しいです、新しく作成されたディレクトリは繰り返しファイルを持っていますので、cpはmvよりはるかに意味があります。 – TNKaf

+0

tarballは、それぞれ他の多くのディレクトリ/ファイルを格納する単一のディレクトリで構成されています。例えば。 1.0.11.class.tgzはすべ​​て/ test /ディレクトリで構成されています。抽出された/ "test"ディレクトリの名前を "test_1.0.11"のように変更して、それぞれの比較対象の両方のtarball/1.0.11to1.0.12が1つの/ testに抽出されるように注意しながら、これらの各tarballを抽出する方法はありますか? ?ありがとう、トン! – TNKaf

関連する問題