web-dev-qa-db-ja.com

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

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

tarを同じように機能させる方法はありますか?マニュアルページには、それを示すものは何もないようです。

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

35
Benji XVI

GNU tarは特発性炎に住んでいるので、当然そのためのオプションもいくつかあります。
http://www.gnu.org/software/tar/manual/html_node/transform.html

いくつかのパスセグメントを削除するだけの場合は、--strip-components=nまたは--strip=nがよく実行されます。

 tar xvzf tgz --strip=1

ただし、抽出するファイルを正規表現で書き換えることもできます(フラグは--transformまたは--xformで、/x修飾子でeregを受け入れます)。

 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の構文は明らかに優れています。

84
mario

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

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

paxはそれを行うことができます:

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

または

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

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

8
hfs

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

  1. tar tvfを使用して、tarballからすべてのファイルを取得します
  2. それらのファイルを個別に抽出します-tarでstdoutに抽出し、$ 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からプルされたディレクトリで見つかった重複するファイル名を上書きします。

1
DaveParillo