web-dev-qa-db-ja.com

解凍中にディレクトリ名を選択する方法

私がugly_name.tarという名前のファイルを持っているとしましょう。抽出すると、ugly_nameディレクトリになります。結果として得られるディレクトリ名がpretty_nameになるように、どのコマンドを使用できますか?

132
tshepang

これはうまくいくはずです:

mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1

-Cアンパック(またはパック)する前に、指定したディレクトリに移動します。 --strip-componentsは、アーカイブに保存されているファイル名から、指定された数のディレクトリを削除します。

これは実際には移植性がないことに注意してください。 GNU tarおよび少なくとも一部のBSD tarには--strip-componentsオプションですが、他のUNIXライクなプラットフォームには存在しないようです。

これを行うばかげた方法は、ほとんどどこでも機能します。

tar xf ugly_name.tar && mv ugly_name pretty_name
187
Mat

GNU tar ≥1.16の場合、 --transform 各ファイル名にsed正規表現変換を適用します(変換はアーカイブの完全パスに適用されます):

tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'

ugly_nameは、アーカイブ内のすべてのファイル名の最上位コンポーネントです。正確に一致する必要はありません。

tar xf foo.tar --transform 's/ugly_name/pretty_name/'

トップレベルディレクトリの名前がわからない場合でも、この方法を使用できますが、 --strip-components 代わりに。

tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'

pax 、POSIXアーカイブユーティリティでは、-sオプション。sedのような置換式を引数として使用します。

pax -rf foo.tar -s '!^ugly_name\($\|/\)!pretty_name\1!'
pax -rf foo.tar -s '/ugly_name/pretty_name/'
pax -rf foo.tar -s '!^[^/]\+\($\|/\)!pretty_name\1!'

最も簡単な方法

tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
11
marquicus

これを使って :

tar -xvf ugly_name.tar
mv ugly_name pretty_name
9
Rupesh Mande

AskUbuntuから、これは answer でうまくいきました:

tar zxvf ugly_name.tgz --one-top-level=pretty_name

`--one-top-level [= dir] '

Tarに、抽出ディレクトリ(または「-C」に渡されたディレクトリ)の下に新しいディレクトリを作成し、それを使用してtarbombから保護するように指示します。 dir引数がない場合、新しいディレクトリの名前は、アーカイブのベース名と同じになります(ファイル名から、認識された場合はアーカイブサフィックスを引いたもの)。 (「--transform」および「--strip-components」からの変換後の)そのディレクトリ名で始まらないメンバー名には、プレフィックスが付けられます。認識されるファイル名のサフィックスは `.tar 'であり、See -auto-compress で認識できる任意の圧縮サフィックスです。


更新

comments で指摘されているように、この方法は適切に形成されたアーカイブでは機能しませんが、- another answer が示すように、--strip-components 1これが本当に機能するために。私はこの新しいオプションでテストしましたが、トップレベルの名前のアーカイブとそれ以外のアーカイブの両方で機能します。

3
smac89