同じxargs
インスタンスにパイプ処理して、それらを一緒に処理できるようにする複数のシェルコマンドがあります。
ファイルとglob式の2つの入力があります。
$ cat subdomains.txt
admin.site.com
web.site.com
api.site.com
$ ls -d x*
xab xac xad
私はこれに変えたい:
admin.site.com:xab
admin.site.com:xac
admin.site.com:xad
web.site.com:xab
web.site.com:xac
web.site.com:xad
api.site.com:xab
api.site.com:xac
api.site.com:xad
これが私が試したコマンドです(動作しません):
cat subdomains.txt | ls -d x* | xargs -I value1,value2 echo 'value1:value2'
あなたはGNU parallel
:
$ printf '%s\n' x* | parallel echo "{1}:{2}" :::: subdomains.txt :::: -
admin.site.com:xab
admin.site.com:xac
admin.site.com:xad
web.site.com:xab
web.site.com:xac
web.site.com:xad
api.site.com:xab
api.site.com:xac
api.site.com:xad
醜い方法:eval
が必要なのは、中括弧の展開は通常変数の展開の前に行われるため、2回の評価が必要になるためです。
sub=$( paste -sd, subdomains.txt )
xs=$( ls -d x* | paste -sd, )
eval "printf '%s\n' {$sub}:{$xs}"
より良い方法:個々のステップの結果を配列に格納し、ネストされたループを使用してそれらを結合します。
mapfile -t sub < subdomains.txt
xs=( x* )
for s in "${sub[@]}"; do
for x in "${xs[@]}"; do
echo "$s:$x"
done
done
$ printf '%s\n' x* | join -t : -1 2 -2 2 -o 1.1,2.1 subdomains.txt -
admin.site.com:xaa
admin.site.com:xab
admin.site.com:xac
web.site.com:xaa
web.site.com:xab
web.site.com:xac
api.site.com:xaa
api.site.com:xab
api.site.com:xac
これは、join
を使用して、ファイルsubdomains.txt
にリストされているドメインと、現在のディレクトリの文字x
で始まるファイル名との間に一種の外積を生成します。
外積は、join
に、存在しないフィールド(列2、-1 2
および-2 2
で指定)で2つのデータセットを結合するように要求することによって生成されます。また、入力フィールドと出力フィールドの区切り文字を:
と-t :
で指定し、-o 1.1,2.1
を使用して各ファイルから最初の列を取得するように明示的に要求します(または、最初に空があったはずです)結果の列)。
必要なのはprintf '%s\n' x*
32000以上のファイルがある場合。
そうでなければこれはうまくいきます:
parallel mytool.sh --parm1 {1} --parm2 {2} :::: subdomains.txt ::: x*
http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html の第1 +2章を読んでください( https://doi.org/10.5281/zenodo.1146014 )でダウンロードされます。あなたのコマンドラインはそれのためにあなたを愛します。
(x*
ファイルはsplit
からのものです。第9章も読む必要があります。
parallel -a bigfile --block 10M --pipepart --argsep ,, -I ,, parallel --pipe --tee wc {} ::: -l -c -w
)。