tar.gz 圧縮を行うときにフルパスを削除するにはどうすればよいですか?

tar.gz 圧縮を行うときにフルパスを削除するにはどうすればよいですか?

gこのコマンドを使用して、Java コードから名前が付けられたディレクトリをアーカイブします。

tar czf /a/b/c.tar.gz /e/f/g

tar ファイルが作成されると、その中のフォルダーのc.tar.gzパス全体とすべてのファイルが表示されます。しかし、圧縮アーカイブを開いたときに、フォルダーの下にあるファイルのみを表示したいのです。.tar.gzファイル内のフォルダーを削除するにはどうすればよいですか?e/f/ggg/e/f/

答え1

tar -czf /a/b/c.tar.gz -C /e/f/g .

オプションは作業ディレクトリを変更するので、 を追加するだけで済み-Cます。tar.

見る:作業ディレクトリの変更 – GNUtarマニュアル

答え2

この質問は少し前のものですが、相対パスを使用して特定の検索基準でファイルとフォルダーを追加するための答えを自分で簡単に見つけることができませんでした。

以下は、質問された内容よりも広いトピックをカバーしています。そのため、調査の結果、私が思いついた解決策を書き留めています。

$input_dir変数が目的のディレクトリを指していて、すべての*.txtファイルをtar して圧縮 (gzip を使用) しようとしていると仮定します~/my_txt.tar.gz。tar にパス (相対パス) を保存せずに gzip 圧縮された tarball を作成するには、次のようにします。

find "$input_dir" -maxdepth 1 -type f -name "*.txt" -printf "%P\0" | tar --null --create --remove-files --gzip --file="$HOME/my_txt.tar.gz" --directory="$input_dir" --files-from=-

詳しく見てみましょう:

  • "$input_dir": 開始点ディレクトリ。好きなように変更してください。
  • maxdepth 1: そのディレクトリのルートのみを検索します。すべてのレベルまたは異なるレベルを検索する場合は、これを削除または変更できます。
  • -type f: ファイルのみ検索
  • -name "*.txt": *.txt の条件に一致する
  • -printf "%P": 相対パスを出力します (man ページ:「ファイル名から、そのファイルが見つかった開始点の名前を削除したもの」)。
  • -printf "%P\0": 相対パス出力をヌルで終了する
  • | tar: 出力を次のコマンド(ここではtar)にパイプします
  • --null: は、後続の--files-fromオプションにヌル終端名を読み取るように指示します。通常の終端出力ではなく、findヌル終端 ( ) 出力を作成するように要求したことを覚えておいてください。これは、スペースやその他の特殊文字を含む可能性のあるすべてのファイル名をカバーするためです。\0\n
  • --create: tar ファイルを作成します。 に等しい-c
  • --remove-files: このオプションは、tarball に追加されたファイルを削除するために使用します。ドロップしてもかまいません。
  • --gzip: tarball を gzip します。 と同じです-z
  • --file="$HOME/my_txt.tar.gz": 出力されるgzip圧縮されたtarballファイル。-f "$HOME/my_txt.tar.gz"
  • --directory="$input_dir": これは、tarがこのディレクトリに変更されることを意味します。 次に、このディレクトリで渡されるファイル名を検索します (ファイル名の相対パスをこのフォルダーに設定したことに注意してください)。 に等しいです-C "$input_dir"
  • --files-from=/dev/stdin: 一般的な形式は です--files-from=FILE。このオプションを--nullオプションと共に使用するtarと、 内の名前がFILE改行 ( ) ではなく ASCII NULL 文字で区切られます。 は である(ディスク上の から読み取るのではなく、から直接 にパイプされる)\nとも言えます。は と等しくなります。FILEstdinfindtarFILE-T -

上記の一部は1文字のオプションに変更でき、組み合わせることもできます。

find "$input_dir" -maxdepth 1 -type f -name "*.txt" -printf "%P\0" | tar --null --remove-files -czf "$HOME/my_txt.tar.gz" -C "$input_dir" -T -

-tまたはオプションを使用してファイル リストを確認できます--list

tar -tf "$HOME/my_txt.tar.gz"

ここで、ファイルを $output_dir ディレクトリ (存在します) に抽出するには、次のようにします。

tar -xvzf "$HOME/my_txt.tar.gz" -C "$output_dir"

このvオプションは詳細であり、tarball の作成中に追加することもできます。

答え3

slhck の回答では、必要なファイルをフィルタリングできず、ディレクトリ全体が含まれます。また、このディレクトリ オプションではシェルのグロビングは機能しません (ここで説明されているこの問題を参照してください)。「ディレクトリの変更」オプションを使用して tar globbing を機能させる方法)。

shaheen g の回答は素晴らしいですが、ヌルバイトは文字列では禁止されているため、プログラミング言語でコマンドを使用することができませんでした。そのため、空白文字を含むファイル名を処理する必要がない場合は、ヌルバイトなしで動作するように適応させました。回答ここ

tar -czf /a/b/c.tar.gz -C /e/f/g $(find /e/f/g -maxdepth 1 -type f -name "*.txt" -printf "%f\n")

または

find /e/f/g -maxdepth 1 -type f -name "*.txt" -printf "%f\n" | tar -czf /a/b/c.tar.gz -C /e/f/g -T -

関連情報