2016-07-28 5 views
1

私は、project/subproject/target/subproject.jarに似たパスに多数のjarファイルを作成する大きなプロジェクトを持っています。私はすべての瓶を1つの圧縮されたタールに集めるコマンドを作りたいが、ディレクトリは必要ない。私が今まで出てきたコマンドは:find project -name \*.jar -exec tar -rvf Collectors.tar.gz -C $(dirname {}) $(basename {}) \;ですが、これは私が意図しているとおりにはうまく機能していませんが、ディレクトリはまだそこにあります。ディレクトリなしでjarをタールに集める

この問題を解決する方法はありますか?

答えて

1

あなたのコマンドは非常に近いですが、問題は、bashががfindを実行する前に$(dirname {})$(basename {})を実行していることです。ので、あなたのコマンドは、このように展開:

-C .は何-OPと{}がちょうどフル相対ディレクトリ+ファイル名に展開されていない
find project -name \*.jar -exec tar -rvf Collectors.tar.gz -C . {} \; 

。この種のものを修正する

つの汎用の方法は、あなたが個々のファイルのためのBashを呼び出すので、バッシュワンライナーで-execに引数を包む、それは右でdirnamebasenameを実行させることです時間:あなたの特定のケースで

find project -name \*.jar -exec bash -c 'tar -rvf Collectors.tar.gz -C "$(dirname "$1")" "$(basename "$1")"' '' '{}' \; 

は、しかし、私は、ファイルのディレクトリに初find「はそれcd以外-execと同じであるS -execdirアクション」のにあなたを指すと思います。だから、簡単に書くことができます。

find project -name '*.jar' -execdir tar -rvf "$PWD/Collectors.tar.gz" '{}' \; 

find -execdircdがになることではなくディレクトリに比べて、あなたが現在ディレクトリにCollectors.tar.gzに書き込むことを確認することですその$PWD一部を、注意してください。)

+0

これはより近いですが、複数のタールを作成します。各ディレクトリに1つ。私はすべての瓶で1つのタールが必要です。 – brostone51

+0

おっと、下さった、すみません、ごめんなさい。 – ruakh

関連する問題