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

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

前の質問私の質問の 1 つは、ダウンロードしたファイルを tar 経由でパイプする方法ですが、今度は tar の出力を mv 経由でパイプする方法を知りたいです。現時点では、次のコマンドがあります。

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

これにより、 というディレクトリが作成されますが、この出力ディレクトリの名前を に変更するには、このコマンドの末尾にパイプ ( ) を使用するmoksha-0.1.0などして変更する方法を知りたいと思います。ただし、パイプを使用せずに wget や tar と同じコード行でこれを行う方法をご存知でしたら、それも喜んで承ります。moksha|

明確に言うと、私は次のことを知っています。

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.0mokshamoksha-0.1.0moksha

答え1

このような?

[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:

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

したがって、sedこれが機能するにはおそらく が必要です。ただし、 をお持ちの場合は、もwgetおそらく をお持ちです。sed

答え2

注: 私の回答は に関するものではなくtar、具体的には質問のこの部分に対する回答です:

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

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

あなたが欲しいのはリスト

から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.

1 つのコマンドに対して単純な 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

答え3

あなたはできませんパイプmvは、標準入力からソースファイルを読み込まないので、ファイルmv自体を で読み込むことはできません。この場合、最善の策は、tar出力先ディレクトリを変更するか(ディー・エフの答え)または事後に名前を変更する(ワイルドカードの答え)。

私は前者を好みますが、の代わりに-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意思ない実際のところ、その引数は作成されません (少なくとも私のシステムの BSD または GNU では作成されませんtar)。

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

質問でリンクしたアーカイブのルートにはディレクトリが1つしかありませんが、この手法をアーカイブで使用すると、複数ルートディレクトリにあるすべてのディレクトリの内容を で指定されたディレクトリにダンプします-C。このような場合は、必要に応じて抽出し、名前を変更する

関連情報