回答:
これは動作するはずです:
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
tar -xvf /tmp/backupfiles.tar -C /var/www/
mv ugly-* pretty_name
ugly_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
--strip-component 1
は、mkdir
またはのいずれかの--strip-components 1
方法で必要ですpretty_name/ugly_name/
。それ以外の場合は、単にを取得します。
askUbuntuから、この答えは私のために働いた:
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で認識可能な圧縮接尾辞はすべてです。
コメントで指摘されているように、この方法は適切に形成されたアーカイブでは機能しませんが、別の答えが示すように、--strip-components 1
これを実際に機能させるには追加する必要があります。この新しいオプションでテストしましたが、トップレベルの名前を持つアーカイブと持たないアーカイブの両方で機能します。
pretty_name
し、その中に元のトップレベルのディレクトリを作成することです。たとえば、tar xzf ugly_name.tgz
というディレクトリを作成する場合ugly_name/
、指定したコマンドが作成されますpretty_name/ugly_name/
。