web-dev-qa-db-ja.com

ディレクトリ構造のない.tarファイル

パスが.tarのファイルをexample/super_user/Output.*ingしています。

結果の.tarは次のようになります。

+ example
    + super_user
          - Output.Zip
          - Output.xml
          - Output.txt

しかし、私はファイルを次のようにしたいです:

- Output.Zip
- Output.xml
- Output.txt

別のディレクトリにいるときに、これをどのように達成できるか知っていますか?

34
user36938

tarはファイルとフォルダーの構造を保持するため、作成時に階層を平坦化するようにtarに指示する方法はないと思います。

回避策の1つは、一時的にディレクトリを変更し、tarを作成してから戻ることです-以下の簡単な例:

cd example/super_user && tar -cvf ../../result.tar Output.* && cd ../..
11
Gaff

ディレクトリ「example」がファイルシステムのルートにある場合、ここに別の方法があります:

tar -C /example/super_user -cvf result.tar .

これにより、ディレクトリをtarを実行するポイントに変更します。警告は、/ example/super_userの下にサブディレクトリがある場合、これらのサブディレクトリのディレクトリ構造が保持されることです。

29
Anthony Walters

私はここに私の答えを投稿しました:

https://stackoverflow.com/questions/13924856/unix-tar-do-not-preserve-directory-structure

再投稿(レイジーPPLの場合)


これは醜いです...しかしそれはうまくいきます...

私も同じ問題を抱えていましたが、複数のフォルダーがあるため、すべてのファイルをフラットにしたかっただけです。オプション「transform」を使用して、sed式を渡すことができます。..期待どおりに機能します。

これは式です:

's/.*\///g'( '/'の前のすべてを削除)

これが最後のコマンドです。

tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info

10

親ディレクトリ情報(./も含めない)なしで、ディレクトリ(DIR)からのすべてのファイルでtar(ARCHIVE.tar)を作成するには、次のようなものを使用できます。

find "DIR" -type f -printf "%f\n" | xargs tar cf ARCHIVE.tar -C "DIR"

検索で遊んで深さを制限したり、特定のファイルを選択したり、その他多くのことができます。

幸運を!

7
Paul Bhullar

一時ディレクトリを作成しました。そしてディレクトリに、含まれるファイルへのすべてのファイルへのシンボリックリンクを作成しました。次に、tar -h -Cを実行しました。すべてのファイル(リンクではなくコンテンツ)が希望の名前でアーカイブに含まれるようにします。

3
mzwt

それらがtarballのコンテンツ全体である場合、GNU tarの--strip-componentsオプションを使用して、ファイルの前の2つのレベルを削除できます。

ディレクトリを一時的に変更する別の方法は、cdおよびtarコマンドを括弧()内に置くことです。

(cd example/super_user; tar -cvf ../../result.tar *)

これの利点は、ブロックが完了すると、常に暗黙的に元のディレクトリにポップバックすることです。つまり、pushd .. popdブロックを必要とせず、どこにcdに戻るかを追跡する必要もありません。

1
Stephen Quan
pushd example/super_user
tar -cf output.tar Output.*
popd

pushdは、現在のディレクトリパスをDIRスタックにプッシュし、コンテンツフォルダーに移動します。次に、popdを使用して元のディレクトリに戻ります。

0
Saravana Kumar