web-dev-qa-db-ja.com

tarの出力をmvにパイプするにはどうすればよいですか?

前の質問 ダウンロードしたファイルをtar経由でパイプする方法を尋ねましたが、tarの出力をmv経由でパイプする方法を知りたいと思います。現時点でこのコマンドがあることを確認してください。

wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz

これにより、moksha-0.1.0というディレクトリが作成されますが、このコマンドの最後にあるパイプ(|)を介して、この出力ディレクトリの名前をmokshaに変更する方法を知りたいです。 。パイプなしでこれを行う方法を知っていても、wgetやtarと同じコード行にある場合でも、喜んで受け入れます。

明確にするために、私はそれを知っています:

wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz -C moksha

出力ディレクトリmokshaを作成しますが、この出力ディレクトリ内にはmoksha-0.1.0ディレクトリがあります。代わりに、このmoksha-0.1.0ディレクトリの名前をmokshaに変更します。 mokshaという新しいディレクトリのmoksha-0.1.0

3
BH2017

このような?

[root@b se]# wget -cqO - https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz --transform=s/moksha-0.1.0/moksha/
[root@b se]# ls
moksha
[root@b se]# ls moksha
ABOUT-NLS       config.guess          debian                 Makefile.am
aclocal.m4      config.guess.dh-orig  depcomp                Makefile.in
AUTHORS         config.h.in           doc                    missing
autogen.sh      config.rpath          Enlightenment.pc.in    netwm.txt
autom4te.cache  config.sub            Enlightenment.spec.in  NEWS
BACKPORTS       config.sub.dh-orig    INSTALL                po
BUGS            configure             install-sh             README
ChangeLog       configure.ac          intl                   src
compile         COPYING               ltmain.sh              xdebug.sh
config          data                  m4                     x-ui.sh

tarのマニュアルページから:

-transform =表現、-xform =表現
 sedreplaceを使用する 表現 ファイル名を変換します。

したがって、これを機能させるには、おそらくsedが必要です。 wgetがある場合でも、おそらくsedもあります。

8
Dee Eff

注:私の答えは、実際にはtarに関するものではありません。それは具体的にあなたの質問のこの部分への答えです:

...これによりmoksha-0.1.0というディレクトリが作成されますが、この出力ディレクトリの名前をmokshaに変更する方法を知りたいのですが、おそらく最後にパイプ(|)を使用します。このコマンド。パイプなしでこれを行う方法を知っていても、wgetやtarと同じコード行にある場合でも、喜んで受け入れます。

パイプは、あるコマンドの標準出力を次のコマンドの標準入力に接続します。ファイルとはあまり関係がありません。パイプラインの前のコマンドで作成されたファイルの移動とは関係ありません。

必要なのはリスト

man bashから:

   AND  and  OR  lists are sequences of one of more pipelines separated by
   the && and ││ control operators, respectively.  AND and  OR  lists  are
   executed with left associativity.  An AND list has the form

          command1 && command2

   command2  is  executed if, and only if, command1 returns an exit status
   of zero.

単純なif-thenチェックを実行する、または1つのコマンドを別のコマンドの成功を条件とする最も簡単な方法は、&&を使用することです。例:

[ -r somefile ] && cat somefile
# Checks if somefile exists and is readable; cats the file if it is.

sed -f sedscript inputfile > outputfile && mv outputfile inputfile
# One way (not the best) to edit a file in place.
# The point is that the second command only executes if the first command "succeeds" (i.e. returns a zero exit status).

したがって、特定のコマンドについては、次のようにします。

(The whole command you wrote) && mv moksha-0.1.0 moksha
5
Wildcard

mvを介してファイルをパイプすることはできません—mvは標準からソースファイルを読み取りません入力。この場合、最善の策は、tarを取得して宛先ディレクトリを変更するか( Dee Effの回答 のように)、事後に名前を変更する( ワイルドカードの回答のように))ことです。 )。

私の好みは前者ですが、-Cの代わりに--strip-components--transformを使用します。

mkdir moksha && wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz |
  tar -xzC moksha --strip-components=1

-C willnot、実際には、その引数を作成します—少なくとも私のシステムのBSDまたはGNU tars。)

これはより移植性が高く(BSD tarには--transformがありません)、他の場所で文字列moksha-0.1.0を含むファイル名を変更しません。代わりに、パスの最初のコンポーネントを削除するだけです。抽出される各ファイルの数(たとえば、moksha-0.1.0/ABOUT-NLSABOUT-NLSになります)。 tarが新しいmokshaディレクトリに変更されたため、アーカイブからすべてがそこに抽出されます。

質問でリンクしたアーカイブのルートにはディレクトリが1つしかありませんが、複数のディレクトリが含まれるアーカイブでこの手法を使用することに注意してください。 rootは、これらのディレクトリのすべてのコンテンツを-Cで指定された1つのディレクトリにダンプします。そのような場合、あなたはより良いサービスを受けるでしょう 抽出してから必要に応じて名前を変更します

4