同じベース名のディレクトリにtarを抽出しますか?


18

のようなzip形式のファイルがありますmyArchive123.tar.gz。内部には次のようなフォルダが含まれていますhelloWorld

抽出する場合:フォルダーtar -xf myArchive123.tar.gzを取得しhelloWorldます:

ls 
myArchive123.tar.gz
helloWorld 

出力は、ファイル名から.tar.gz拡張子を除いたものと同じ名前にしたいと思います。すなわち:

tar <magic paramaters> myArchive123.tar.gz 
ls 
 myArchive123.tar.gz
 myArchive123
cd myArchive123
ls 
  helloWorld

これはできますか?

  • アーカイブの内容はわかりません。フォルダーにすることも、多くのファイルにすることもできます。
  • tarでできない場合は、別のツールを使用しても問題ありません。
  • スクリプトに変換できるより長いフォームでも大丈夫です

編集
その間、仕事をやり遂げるように見えるスクリプトを自分でハッキングしました。(以下に投稿された回答を参照してください)。改善できる場合は、コメントや追加の回答を投稿してください。主なことは、次のようなワンライナーにパッケージ化できることです。

extract <file>

1
アーカイブには常に正確に1つのフォルダーが含まれていますか?
マークPlotnick


抽出時に何が入っているのかわかりません。これは、アーカイブ内の内容にも依存するべきではありません。フォルダーの場合は、そこにフォルダーを抽出します。ファイルの場合は、すべてのファイルを抽出します。
レオウフィムツェフ

それまでの間、私はスクリプトをつなぎ合わせました(以下を参照)。私は答えを2日以内に受け入れることができます。
レオUfimtsev

アーカイブには、最上位に複数のフォルダーが含まれますか?
マークPlotnick

回答:


10

gnu tar使用すると、--xform(または--transform)を使用/prefix/して各ファイル名の先頭に追加できます。

tar -xf myArchive.tar.gz --xform='s|^|myArchive/|S'

リード/インはなくprefix/sed式はSファイル名変換からシンボリックリンクターゲットを除外するために終わることに注意してください。
テストするには(ドライラン):

tar -tf myArchive.tar.gz --xform='s|^|myArchive/|S' --verbose --show-transformed-names

始めるために、次のように呼び出すことができる非常に単純なスクリプトを次に示しますextract <file>

STRIP = $ {1%。*} #strip last suffix
NAME = $ {STRIP%.tar} #strip .tarサフィックス(存在する場合)
tar -xf "$ 1" --xform = "s | ^ | $ NAME / | S" #runコマンド

エキス<ファイル>:これは私のようなものにそれをパッケージ化できるようにしたいことを除いて、私が欲しいものに近い
レオUfimtsev

これはバグが多く、最初のドットで停止します。たとえば、次のようなファイルがあります。eclipse-SDK-4.5M6-linux-gtk-x86_64.tar.gz .tar.gzのない出力を期待していますが、eclipse-sdk-4を取得します
Leo Ufimtsev

上記のスクリプトでは、拡張子を削除し、「tar」が見つかった場合はさらに削除します。
レオUfimtsev

一般に、多くの種類のアーカイブを使用します。簡単なワンライナーが欲しいと思っていたので、引数フラグが足りなかったのではないかと思いました。しかし、これには些細な解決策はないようです?
レオUfimtsev

良いもの。これは機能し、私が書いたスクリプトよりも短いです。いいね!
レオUfimtsev

7

まあ、少なくとも数ステップでそれを行うことができます。もしそうなら

mkdir <archive name>
tar -xf <archive name>.tar.gz --strip-components=1 -C <archive name>

まだもっとコンパクトな答えがあるかもしれませんが、それはタスクを達成するでしょう。


3

編集

受け入れられた答えは以下よりも短いです。(同じことをしますが、通常は短いほうが良いです)。


私は最終的に手元のタスクのスクリプトをハッキングしました。.tar .tar.gzおよび.gzで動作します

#!/bin/sh
#usage:
# nameOfScript myArchive.tar.gz
# nameOfScript myArchive.gz
# nameOfScript myArchive.tar
#
# Result:
# myArchive   //folder
fileName="${1%.*}" #extracted filename

#handle the case of archive.tar.gz
trailingExtension="${fileName##*.}"
if [ "$trailingExtension" == "tar" ]  
then
    fileName="${fileName%.*}"  #remove trailing  tar.
fi

mkdir "$fileName"
tar -xf "$1" --strip-components=0 -C "$fileName"

使用法:

   nameOfScript archive.tar.gz 
   ls 
    archive
   cd archive 
   ls 
    <archive content>

このソリューションでは、ファイル名にドットを使用できることに注意してください。たとえば、Eclipse-4.5M-SDK.tar.gz。

スクリプトをgitリポジトリに保持します。最新バージョンについては、https//github.com/LeoUfimtsev/ldts/blob/master/pathscripts/leo-tar-hereを参照して ください。


2

もう1つの可能な解決策は、--transformオプションを使用することです。

tar -xzf ARCHIVE_NAME.tgz --transform="s/OLD_DIR_NAME/ARCHIVE_NAME/"

あなたのファイルで:

tar -xzf myArchive123.tar.gz --transform="s/helloWorld/myArchive123/"

1
しかし、これは、アーカイブ内の内容を知っていることを前提としています
レオUfimtsev

たとえば、アーカイブ内の内容を知らずに、これを1行のスクリプトに変換するにはどうすればよいですか?
レオUfimtsev

正解です。ここに書いたように、それは唯一の可能な解決策です
...-svq

それと--strip-compoments = 0 myArchive123の間に違いはありますか?
レオUfimtsev

1
そして--strip-components=0、パスから最初のディレクトリ名を削除し、-Cオプションでアーカイブ解除されたファイルを新しいディレクトリに保存します。
svq
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.