mvパイプを介してtarの出力をパイプする方法は?

mvパイプを介してtarの出力をパイプする方法は?

前の質問私の友人がtarを介してダウンロードしたファイルを転送する方法を尋ねたので、mvを介してtarの出力を転送する方法を知りたいです。今、次のコマンドがあります。

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 を使用した交換表現するファイル名を変換します。

だからsedこれが必要かもしれません。しかし、あなたが持っているなら、wgetおそらくあなたsedもそうでしょう。

答え2

注:私の答えは本当ではありませんtar。これはあなたの質問のこの部分に対する具体的な答えです。

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

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

あなたが望むものは一つです。リスト

から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チェックを実行するか、他のコマンドが成功するかどうかを条件として指定する最も簡単な方法は、次のようにすることです&&

[ -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。 )

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

質問にリンクしたアーカイブのルートには1つのディレクトリしかありませんが、アーカイブでこのテクノロジを使用していることに注意してください。多くの種類ルートのディレクトリは、そのディレクトリのすべての内容を指定されたディレクトリにダンプします-C。この場合、より良いサービスを受けることができます。必要に応じて抽出し、名前を変更します。

関連情報