unzip
には気の利いたオプション-j
。これにより、アーカイブのディレクトリ構造が破棄され、すべてのファイルが同じディレクトリに抽出されます。
tar
を同じように機能させる方法はありますか?マニュアルページには、それを示すものは何もないようです。
それで、それを行う代替の、できればフリーソフトウェアのツールはありますか?
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
の構文は明らかに優れています。
2つのステップでかなり簡単に行うことができます。必要に応じて調整します。
$ mkdir /tmp/dirtree
$ tar xfz /path/to/archive -C /tmp/dirtree
$ find /tmp/dirtree -type f -exec mv -i {} . \;
$ rm -rf /tmp/dirtree
pax
はそれを行うことができます:
pax -v -r -s '/.*\///p' < archive.tar
または
zcat archive.tar.gz | pax -v -r -s '/.*\///p'
最初に-r
オプションを省略して、名前の置換操作を確認できます。
何もインストールする必要がない可能なソリューション。
tar tvf
を使用して、tarballからすべてのファイルを取得しますそれらのファイルを個別に抽出します-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からプルされたディレクトリで見つかった重複するファイル名を上書きします。