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


125

という名前のファイルがありugly_name.tar、これが抽出されるとugly_nameディレクトリになります。結果のディレクトリ名がpretty_name代わりになるようなコマンドを使用できますか?

回答:


172

これは動作するはずです:

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

私は愚かなバージョンに固執すると思います:)
phunehehe

28
@phunehehe:スマートバージョンの1つの利点は、untarされたディレクトリ名が何であるかを事前に知る必要がないことです
tshepang

2
これが「Pretty_name」以外にも機能することを付け加えます。この方法で特定のディレクトリに展開することもできます。例:tar -xvf /tmp/backupfiles.tar -C /var/www/
一般的な田舎者

2
私は通常、愚かな方法を使用し、wildい名前が何であるかわからない場合や書き留めたくない場合に備えてワイルドカードを使用します。 mv ugly-* pretty_name
デビッドグレイソン

1
既にugly_nameディレクトリが存在する場合、ダムの方法は機能しません。ところで、美しさは見る人の目にあります。
kmiklas

30

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!'

9

これを使って :

tar -xvf ugly_name.tar
mv ugly_name pretty_name

9
&&これらの2つのコマンドの間にリスト演算子を使用することをお勧めします。2番目のコマンドは、最初のコマンドが成功した場合にのみ実行されます。
マナトワーク

1
ディレクトリがugly_name既に存在する場合、これは望ましくない結果をもたらす可能性があります。
ドリュードーマン

7

最も簡単な方法

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

(1)これは明らかに最も単純な方法ではありません。smac89がを含ま--one-top-level=pretty_nameない回答投稿したため--strip-components 1です。(2)逆に、受け入れられた答え(Matによって投稿された)は、--strip-components 1なしで機能します--one-top-level=pretty_name。(3)これらのオプションを組み合わせた回答が、古いオプションよりも優れている理由を説明できますか?コメントで返信しないでください。 回答を編集して、より明確で完全なものにします。
Gマン

多分実際の例はあなたを明確にするのに役立つかもしれません: ` wgetdev.mysql.com/get/Downloads/MySQL-5.7/…tar xvf mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz --one-top -level = mysql57 --strip-components 1 `
marquicus

この答えは最も賛成票が多い答えよりもエレガントです。
カイザーカッツェ

@ G-Man --strip-component 1は、mkdirまたはのいずれかの--strip-components 1方法で必要ですpretty_name/ugly_name/。それ以外の場合は、単にを取得します。
davidA

これは確かに最も簡単な方法です
smac89

2

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/
davidA

1
@davidA良い点。私はこのための修正が含まれるように私の答えを更新しました
smac89
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.