さて、私の考えでは、このプラットフォームでパイプを接続する方法に関する何十もの質問を見つけることができるようです。find
出力しかし、sed
これまで反対方向では何も見つかりませんでした。私がしたいことは私のものを修正することです。入力するとそれからに渡してくださいfind
。
退屈なアスタリスクのワイルドカードを入力しないようにすることで、私の人生をより簡単にするために、次のことをしたいとします。 (この文字列演算子の後にある式が最終的にスクリプトの後半でパラメータに<<<
置き換えられる予定であることが明らかであることを願っています。以下の行はデモ用にのみ提供されています。)$1
$ sed 's/ /\*/g' <<< ' foo bar baz ' | find . -type f -iname -
-
実際、この行の終わりはしなければならない出力をsed
入力として使用してくださいfind
。ただし、find
そのセクションを次に展開します。
... find -D tree . -type f -iname - ...
このパラメータを表示します。いいえパイプを使用して前処理された入力を渡すことができない可能性がfind
あります。find
答え1
find
引数は標準入力ではなくコマンドラインから取得されます。したがって、次のようになります。
find . -iname "$(sed 's/ /\*/g' <<< ' foo bar baz ')"
それは次のとおりです。
find . -iname "foo*bar*baz*"
(シェルがワイルドカードfoo * bar * bas *を拡張するのを防ぐために引用符が必要です)
これはあなたが望むものかもしれないし、そうでないかもしれません。たとえば、foo、bar、またはbazで始まるファイルが必要ですが、「foo * bar * baz *」パターンに一致するファイルは、望ましくない場合は正規表現を設定し、代わりにor-regex
を使用する必要があります。または、次のように、より複雑な検索コマンドを作成します。-iregex
-iname
-iname 'foo*' -o -iname 'bar*' -o -iname 'baz*'
または:
PATTERN='foo bar baz'
PATTERN=$(echo "$PATTERN" | sed -e 's/ /*/g')
# and/or do whatever else you need to do to transform $PATTERN to be what
# you need it to be...
find . -iname "$PATTERN"
これはbashスクリプトのコード行です。コマンドラインと同様に、スクリプトでもまったく同じように動作します。
$ cat ./test.sh
#! /bin/bash
find . -iname "$(sed 's/ /\*/g' <<< ' foo bar baz ')"
$ ls -l
total 4
-rw-r--r-- 1 cas cas 0 Sep 26 16:53 doesntmatch
lrwxrwxrwx 1 cas cas 16 Sep 26 16:59 symlink -> xfoo-ybar-zbaz01
-rwxr-xr-x 1 cas cas 69 Sep 26 16:50 test.sh
-rw-r--r-- 1 cas cas 0 Sep 26 16:50 xfoo-ybar-zbaz01
-rw-r--r-- 1 cas cas 0 Sep 26 16:50 xfoo-ybar-zbaz02
-rw-r--r-- 1 cas cas 0 Sep 26 16:50 xfoo-ybar-zbaz03
$ ./test.sh
./xfoo-ybar-zbaz01
./xfoo-ybar-zbaz03
./xfoo-ybar-zbaz02
$ find . -iname "$(sed 's/ /\*/g' <<< ' foo bar baz ')"
./xfoo-ybar-zbaz01
./xfoo-ybar-zbaz03
./xfoo-ybar-zbaz02
$ find . -iname "*foo*bar*baz*"
./xfoo-ybar-zbaz01
./xfoo-ybar-zbaz03
./xfoo-ybar-zbaz02
答え2
forループを使用しないのはなぜですか?
for n in $(sed 's/ /\*/g' <<< ' foo bar baz '); do find . -iname $n; done