tar –破棄ディレクトリ構造を抽出します


34

unzipにはniftyオプションがあり-j、これによりアーカイブのディレクトリ構造が破棄され、すべてのファイルが同じディレクトリに抽出されます。

tar同じように仕事をする方法はありますか?マニュアルページの何もそう示すようには見えません。

それで、それを行う代替ツール、できればフリーソフトウェアがありますか?


回答:


79

GNU tarは、featuritisに依存しているため、当然、そのためのオプションもいくつかあります。
http://www.gnu.org/software/tar/manual/html_node/transform.html

いくつかのパスセグメントを削除するだけの場合、--strip-components=nまたはそう--strip=nすることがよくあります。

 tar xvzf tgz --strip=1

しかし、抽出されるファイルを正規表現で書き換えることも可能です(フラグは--transformorで--xformあり、modiferでeregを受け入れ/xます)。

 tar xvzf tgz --xform='s#^[^/]+#.#x'
                 # or 's#^.+/##x' for discarding all paths

tarをリストするには、追加の--show-transformedオプションが必要です。

 tar tvzf tgz --show-transformed --strip=1 --xform='s/abc/xyz/x'

書き換えオプションは、抽出だけでなく、パッキングにも有効だと思います。しかしpax、明らかにより良い構文を持っています。


4
どうしてs#.*/##
-l0b0

3
-ストリップはちょうど私の一日を作りました。ありがとう!
サムステファン

--stripos x tarのマニュアルページには記載されていませんが、とにかく動作します、ありがとう!
-slf

3
受け入れられた答えよりもはるかに良い。
クラトゥフォンシュラッケル

との間に違いは--stripあり--strip-componentsますか?
ジョエルバークレー

13

2つの手順でかなり簡単に行うことができます。必要に応じて調整します。

$ mkdir /tmp/dirtree
$ tar xfz /path/to/archive -C /tmp/dirtree
$ find /tmp/dirtree -type f -exec mv -i {} . \;
$ rm -rf /tmp/dirtree

これは私がそれをする方法です(...のfind -exec mv -i代わりに使用しfind | xargsます)....私のためにスクリプトを持ち歩くことなく、任意のシステムで繰り返すことができる簡単な手順。
いんちきのキホーテ2009年

1
+1は、tmpdir=$( mktemp -d )一時ディレクトリを作成するときに便利です
sorki

8

pax 出来る:

pax -v -r -s '/.*\///p' < archive.tar

または

zcat archive.tar.gz | pax -v -r -s '/.*\///p'

-rオプションを省略して、最初に名前置換操作を確認できます。


1

何もインストールする必要のない可能なソリューション。

  1. を使用しtar tvfて、tarballからすべてのファイルを取得します
  2. これらのファイルを個別に抽出します-標準出力にtar抽出し、$ filenameにリダイレクトします

    tar -tvf $1 | grep -v "^d" | \
                  awk '{for(i=6;i<NF+1;i++) {printf "%s ",$i};print ""}' |\
                  while read filename
                  do
                     tar -O -xf $1 "$filename" > `basename "$filename"`
                  done
    

extract.shとして保存し、として実行しextract.sh myfile.tarます。また、tarballから取得したディレクトリで検出された重複ファイル名を上書きします。


実際、私は自宅のいくつかのディレクトリツリーでテストしましたが、スペースを含むファイルでは失敗します。更新を投稿できないかどうかを確認します。
DaveParillo

それを修正しましたが、以前ほどきれいではありません。
DaveParillo

-1
tar xf foo.tar.gz foo/path/to/file/bar.mp3 -O > bar.mp3

この-Oオプションは、ファイルを標準>出力に抽出し、その出力をファイルにリダイレクトします。したがって、私の例では、foo.mp3を抽出し、bar.mp3にリダイレクトしています。ファイル名は任意です。

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