前の質問 ダウンロードしたファイルを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
。
このような?
[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
もあります。
注:私の答えは、実際には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
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 tar
s。)
これはより移植性が高く(BSD tar
には--transform
がありません)、他の場所で文字列moksha-0.1.0
を含むファイル名を変更しません。代わりに、パスの最初のコンポーネントを削除するだけです。抽出される各ファイルの数(たとえば、moksha-0.1.0/ABOUT-NLS
はABOUT-NLS
になります)。 tar
が新しいmoksha
ディレクトリに変更されたため、アーカイブからすべてがそこに抽出されます。
質問でリンクしたアーカイブのルートにはディレクトリが1つしかありませんが、複数のディレクトリが含まれるアーカイブでこの手法を使用することに注意してください。 rootは、これらのディレクトリのすべてのコンテンツを-C
で指定された1つのディレクトリにダンプします。そのような場合、あなたはより良いサービスを受けるでしょう 抽出してから必要に応じて名前を変更します 。