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


32

私はだ.tarパスを持ついくつかのファイルをINGのexample/super_user/Output.*

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

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

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

- Output.zip
- Output.xml
- Output.txt

別のディレクトリにいる間にこれを達成する方法を知っていますか?


そのようなアーカイブでtarbombを避けるようにしてください。
grawity

tar --strip-components = 1000?
ザールハイ

回答:


11

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

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

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

27

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

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

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


1
これは目前の問題に対する答えです。この場合、前述の警告は問題ではありません。他のすべての回答は、問題のバリエーションを説明するための回避策です。
-joki

それがまさにこの問題の解決策です。ディレクトリ構造を想定して、ディレクトリはルートである必要はありません。/home/u/foo/bar作業ディレクトリはで/home/b、その後tar -C foo/bar -cvf qiz.tar .はうまく機能します。1つの警告しかし、あなたはすなわち、ワイルドカードを使用することができないということであるtar -C foo/bar -cvf qiz.tar *.logtar -C foo/bar -cvf qiz.tar "*.log"またはtar -C foo/bar -cvf qiz.tar "foo/bar/*.log"機能しません。
ブライス

1
複数のディレクトリに分散した複数のファイルを追加する必要があるが、tarファイルをフラットにしたい場合-Cは、1つのtarコマンドで複数回使用できることに注意してください。
ゼロ298

10

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

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

再投稿(怠け者向け)


これはいです...しかしそれは動作します...

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

これは式です:

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

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

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


7

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

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

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

がんばろう!


OSXのfindコマンドで「find:-printf:unknown primary or operator」が表示されます。任意のヒント?
TCB13

-printf非標準のコマンドです。それらの多くは、特定のバージョンのfindでのみ機能します。通常、スーパーユーザーに関する質問に回答するときにそれらをマークします(たとえば、「-blahはGnu拡張機能であり、どこでも機能しません」)。
ヘネス14

3

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


1

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


オプションしかあり--strip-pathませんが、使用しても何も変わりません。

1

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

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

この利点は、ブロックが完了すると、常に暗黙的に元のディレクトリにポップバックすることです。つまりは必要ありませんpushd。.. popdする場所のブロックまたは維持トラックcdにバックします。


0
pushd example/super_user
tar -cf output.tar Output.*
popd

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.