あ前の質問私の質問の 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.0
moksha
moksha-0.1.0
moksha
答え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
。このような場合は、必要に応じて抽出し、名前を変更する。