2016-03-22 9 views
1

私は内部にプロジェクトがいっぱいのディレクトリを持っています。/Users/Me/Projectsとしましょう。複数のディレクトリから複数のtar.gzアーカイブを作成する

このフォルダの内部には複数のサブディレクトリがあり、その中にはさらに複数のサブディレクトリがあります。

/Users/Me/Projectsの各アーカイブのtar.gzアーカイブを作成したいと思います。そのアーカイブの名前は、ディレクトリと同じになります。

たとえば、Projectsフォルダには、Project1,Project2、およびProject3があります。私が望む何

は、Project1.tar.gzProject2.tar.gz、およびProject3.tar.gzを作成するために、その下のサブディレクトリProjectsにディレクトリをループにスクリプトを実行しないことです。

答えて

2

findなし:

for dir in */; do tar -czvf "${dir%/}".tar.gz "$dir"; done 
*/はグロブはディレクトリのみに一致することを確認します

、および"${dir%/}"は、ディレクトリ名から末尾のスラッシュを削除します。

隠しディレクトリがある場合、それらは/*と一致しません。それらも取得してください、私たちはshopt -s dotglobを使用することができます。

+0

あなたの答えをありがとう。私が持っていた簡単な質問ですが、元のディレクトリがどこに存在するかのほかに、新しく作成されたアーカイブを出力するためにこのスクリプトを変更するにはどうすればよいですか?私がこれらのアーカイブを作成している展開されたディレクトリのほとんどは、外付けハードドライブにあり、私は内蔵ハードディスクにアーカイブを配置したいと考えています。それは 'のように見えるでしょうか?/; tar -czvf /Users/Username/Archives/"${dir%/}".tar.gz "$ dir"を実行します。例えば? –

+0

@ jzg.devまさに!コマンドが何をしているのかわからない場合は、その前に 'echo'を挿入して、実際にそれらを実行することなく、削除するときに実行されるコマンドだけを見ることができます:' for dir in * /;エコータールをする...' –

+1

助けてくれてありがとう! :) –

1

いくつかの検索と少しの試行錯誤の後、私はこのスクリプトを使い、私がやろうとしていたことをプログラムで達成しました。私は疑問に与えた例オフ再び行く

#! /bin/sh 

    for dir in `find . -maxdepth 1 -mindepth 1 -type d | sed 's|./||'` 
    do 
     tar -czvf /Path/To/Place/Created/Archives/$dir.tar.gz /Path/To/Directories/$dir; 
    done 

、スクリプトは私が私のDocumentsフォルダにアーカイブを作成したいと仮定すると、このようになります。さらにいくつかの研究の後

#! /bin/sh 

    for dir in `find . -maxdepth 1 -mindepth 1 -type d | sed 's|./||'` 
    do 
     tar -czvf /Users/Me/Documents/$dir.tar.gz /Users/Me/Projects/$dir; 
    done 

EDIT

、ベンジャミン・W.によって与えられた答えは、これを行うための最も単純な方法であると思われます。私は、新しく作成されたアーカイブ名からスペースを取り除いて、他のファイルシステム上で起こりうる問題を避ける方法を見つけることを望んでいましたが、私が説明した方法は空白を取り除きますが、 GNUで

+1

あなた自身の答えを見つけるのにうれしいですが、[for'で行を読んでいない](http://mywiki.wooledge.org/DontReadLinesWithFor) –

+0

最後に 'sed'を使う必要はありません。あなたが '-print0 | xargs -0 tar ... 'それはとても素敵な答えになります – HuStmpHrrr

1

は見つける:

cd /Users/Me/Projects 
find . -maxdepth 1 -mindepth 1 -type d -exec tar -cvzf {}.tgz {} \; 
関連する問題