私がugly_name.tar
という名前のファイルを持っているとしましょう。抽出すると、ugly_name
ディレクトリになります。結果として得られるディレクトリ名がpretty_name
になるように、どのコマンドを使用できますか?
これはうまくいくはずです:
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
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
これを使って :
tar -xvf ugly_name.tar
mv ugly_name pretty_name
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
これが本当に機能するために。私はこの新しいオプションでテストしましたが、トップレベルの名前のアーカイブとそれ以外のアーカイブの両方で機能します。