パスが.tar
のファイルをexample/super_user/Output.*
ingしています。
結果の.tar
は次のようになります。
+ example
+ super_user
- Output.Zip
- Output.xml
- Output.txt
しかし、私はファイルを次のようにしたいです:
- Output.Zip
- Output.xml
- Output.txt
別のディレクトリにいるときに、これをどのように達成できるか知っていますか?
tarはファイルとフォルダーの構造を保持するため、作成時に階層を平坦化するようにtarに指示する方法はないと思います。
回避策の1つは、一時的にディレクトリを変更し、tarを作成してから戻ることです-以下の簡単な例:
cd example/super_user && tar -cvf ../../result.tar Output.* && cd ../..
ディレクトリ「example」がファイルシステムのルートにある場合、ここに別の方法があります:
tar -C /example/super_user -cvf result.tar .
これにより、ディレクトリをtarを実行するポイントに変更します。警告は、/ example/super_userの下にサブディレクトリがある場合、これらのサブディレクトリのディレクトリ構造が保持されることです。
私はここに私の答えを投稿しました:
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
親ディレクトリ情報(./も含めない)なしで、ディレクトリ(DIR)からのすべてのファイルでtar(ARCHIVE.tar)を作成するには、次のようなものを使用できます。
find "DIR" -type f -printf "%f\n" | xargs tar cf ARCHIVE.tar -C "DIR"
検索で遊んで深さを制限したり、特定のファイルを選択したり、その他多くのことができます。
幸運を!
一時ディレクトリを作成しました。そしてディレクトリに、含まれるファイルへのすべてのファイルへのシンボリックリンクを作成しました。次に、tar -h -Cを実行しました。すべてのファイル(リンクではなくコンテンツ)が希望の名前でアーカイブに含まれるようにします。
それらがtarballのコンテンツ全体である場合、GNU tarの--strip-components
オプションを使用して、ファイルの前の2つのレベルを削除できます。
ディレクトリを一時的に変更する別の方法は、cd
およびtar
コマンドを括弧(
)
内に置くことです。
(cd example/super_user; tar -cvf ../../result.tar *)
これの利点は、ブロックが完了すると、常に暗黙的に元のディレクトリにポップバックすることです。つまり、pushd
.. popd
ブロックを必要とせず、どこにcd
に戻るかを追跡する必要もありません。
pushd example/super_user
tar -cf output.tar Output.*
popd
pushdは、現在のディレクトリパスをDIR
スタックにプッシュし、コンテンツフォルダーに移動します。次に、popd
を使用して元のディレクトリに戻ります。