コマンド(などls -1
)からの出力があるとします。
a
b
c
d
e
...
echo
それぞれにコマンド(たとえば)を順番に適用したいと思います。例えば
echo a
echo b
echo c
echo d
echo e
...
それをbashで行う最も簡単な方法は何ですか?
コマンド(などls -1
)からの出力があるとします。
a
b
c
d
e
...
echo
それぞれにコマンド(たとえば)を順番に適用したいと思います。例えば
echo a
echo b
echo c
echo d
echo e
...
それをbashで行う最も簡単な方法は何ですか?
回答:
おそらく最も簡単に使用できますxargs
。あなたの場合:
ls -1 | xargs -L1 echo
この-L
フラグは、入力が正しく読み取られるようにします。のマニュアルページからxargs
:
-L number
Call utility for every number non-empty lines read.
A line ending with a space continues to the next non-empty line. [...]
ls
自動的に-1
パイプで行います。
ls | xargs -L2 echo
し、ls -1 | xargs -L2 echo
二つの異なる出力を与えます。前者はすべて1行になっています。
xargs
シェル関数やシェル組み込みコマンドではなく、実行可能ファイルのみを実行できます。前者の場合、最善の解決策はおそらくread
ループ内のものです。
-L1
ための説明が含まれているといいのですが。
各行で基本的なプリペンド操作を使用できます。
ls -1 | while read line ; do echo $line ; done
または、より複雑な操作のために出力をsedにパイプすることもできます。
ls -1 | sed 's/^\(.*\)$/echo \1/'
sh: cho: not found a sh: cho: not found
取っているように見えるe
のsedコマンドか何かであることをエコーで。
while
ループの場合は+1 。cmd1 | while read line; do cmd2 $line; done
。またはwhile read line; do cmd2 $line; done < <(cmd1)
、サブシェルを作成しません。これはあなたの簡易版であるsed
コマンド:sed 's/.*/echo &/'
"$line"
単語の分割を避けるために、whileループで引用します。
read -r line
してread
、エスケープされた文字が乱れるのを防ぎます。たとえば、エスケープを失ったecho '"a \"nested\" quote"' | while read line; do echo "$line"; done
を与え"a "nested" quote"
ます。私たちがそうecho '"a \"nested\" quote"' | while read -r line; do echo "$line"; done
するならば、我々は"a \"nested\" quote"
期待通りに得る。参照してくださいwiki.bash-hackers.org/commands/builtin/read
*のファイル; 行う 「$ file」をエコー できた
問題のコマンドが複数の引数を受け入れる場合、問題のユーティリティを複数回ではなく1回だけ起動する必要があるため、xargsを使用するとほとんどの場合より効率的です。
printf '%s\0' * | xargs -0 ...
-それ以外の場合、空白や引用符を含むファイル名を使用すると、非常に危険です
GNU sedであれば、実際にsedを使用してそれを行うことができます。
... | sed 's/match/command \0/e'
使い方:
cat /logs/lfa/Modified.trace.log.20150904.pw | sed -r 's/^(.*)(\|006\|00032\|)(.*)$/echo "\1\2\3 - ID `shuf -i 999-14999 -n 1`"/e'
for s in `cmd`; do echo $s; done
cmdの出力が大きい場合:
cmd | xargs -L1 echo
cmd
出力にスペースがある場合、最初の出力は失敗します。
xargsは、バックスラッシュと引用符で失敗します。それは次のようなものである必要があります
ls -1 |tr \\n \\0 |xargs -0 -iTHIS echo "THIS is a file."
xargs -0オプション:
-0, --null Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are not special (every character is taken literally). Disables the end of file string, which is treated like any other argument. Useful when input items might contain white space, quote marks, or backslashes. The GNU find -print0 option produces input suitable for this mode.
ls -1
アイテムを改行文字で終了するため、tr
それらをnull文字に変換します。
このアプローチは、手動で繰り返すよりも約50倍遅くなりますfor ...
(Michael Aaron Safyanの回答を参照)(3.55秒vs. 0.066秒)。しかし、locate、find、ファイルからの読み取り(tr \\n \\0 <file
)などの他の入力コマンドの場合、xargs
このように操作する必要があります。
私にとってより良い結果:
ls -1 | xargs -L1 -d "\n" CMD
find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 command
の出力がls -1
があいまいなます。あなたがそれぞれにリードをしたくない場合-printf '%P\0'
よりも使用して-print0
ください./
。
ls -1
ここに例があるかもしれませんが、の出力を解析することは良くないことを覚えておくことは重要ですls
。参照:mywiki.wooledge.org/ParsingLs