ファイルを一括してスクリプトにフィード

ファイルを一括してスクリプトにフィード

次の命名規則に従うファイルがたくさんあります。

file1_d, file2_d, file3_d, ...,fileN_d

k最初のファイルを入力としてスクリプトに供給し、次のファイルkを2番目のバッチとして供給したいと思います。たとえば、配列を使用してシェルスクリプトでこれを行う簡単な方法はありますか?

答え1

スクリプトを複数回実行し、スクリプトを実行するたびに、一度に1つずつ、一括してスクリプトのコマンドライン引数としてファイルを提供したいとします。 (要件のもう1つの解釈は、スクリプトが標準入力からファイルを読み込み、一度kに1つずつファイルをリンクして提供することです。以下のコードは、これらの解釈を達成するために少し変更するだけです。)

シェルでは、bashスクリプトに提供されているチャンク配列を使用できます。

配列を作成するには:

files=( file*_d )

これにより、ワイルドカードパターンが展開され、file*_d結果の名前がアルファベット順に配列に配置されます。数字順にファイル名が必要で、数字がゼロで埋められていない場合は、中かっこ拡張を使用する方が簡単です。

files=( file{1..N}_d )

...最大数はどこにあります(中括弧拡張範囲の変数は理解されていないため、実際の変数ではありませんN)。bash

zshシェルで次のように配列を作成できます。

files=( file<->_d )

...番号順に並べ替えてください。以下のコードはとzshシェルで動作しますbash

その後、次のループでスクリプトを呼び出すことができます。

k=10
while [ "${#files[@]}" -gt 0 ]; do
    ./myscript "${files[@]:0:k}"
    files=( "${files[@]:k}" )
done

これにより、配列の最初の全体が./myscript呼び出され、その項目が配列から削除されます。配列が空になるまで続きます。kfiles

答え2

では、zsh以下を使用できますzargs

autoload zargs
zargs -l ${k?} -- file<->_d(n) -- myscript

bashおよびGNUユーティリティを使用すると、次のことができます。

xargs -r0n"${k?}" -a <(
  shopt -s failglob extglob
  pattern='file+([0123456789])_d' IFS=
  printf '%s\0' $pattern | sort -zV) myscript

globn修飾子を使用するか、ファイル名が数字でソートされていて、たとえば中央ではなく背面にあることをsort -V確認してください。file10_dfile9_dfile1_dfile2_d

これらのいくつかを実行するには、GNUzargsとGNUの両方にxargsオプションオプションがあります-Pmyscript

答え3

GNU Parallel を使用してバッチ処理を並列に実行できます。

printf '%s\n' file*_d | parallel -j 2 -N "$k" ./myscript

スクリプトがstdinから読み込まれていないが引数が必要な場合は、:::次のように渡すことができます。

parallel -j 2 -N "$k" ./myscript ::: file*_d

-j同時に実行するジョブの数を指定し(デフォルトは使用可能なコアの数)、その-Nケースに合わせてパラメーター制限またはバッチサイズを指定します。したがって、スクリプトがある場合、-j 2 -N 10システムはそれぞれ10個のファイルのリストを提供し、いつでも2つの異なるタスクが実行されます。 1 つが完了すると、すべてのファイルが使用されるまでもう 1 つが起動します。

並列ジョブを実行したくない場合は、以下を通過できます。-j 1

答え4

シンプル - 使用xargs:

$ # Let's create 100 files with your naming convention
$ for i in {1..100} ; do touch $(printf "file%03d_d" $i) ; done

$ # Now let's process them in groups of 4 with this script:
$ cat /path/to/some/script.sh
#!/bin/bash
echo called with "$@"

$ ls | LC_ALL=C sort  | xargs -n 4 /path/to/some/script.sh
called with file001_d file002_d file003_d file004_d
called with file005_d file006_d file007_d file008_d
called with file009_d file010_d file011_d file012_d
...
called with file093_d file094_d file095_d file096_d
called with file097_d file098_d file099_d file100_d

Cロケール接頭辞を使用するのはsortおそらく妄想的です。処理する順序でファイルを並べ替えるロケール/ソートオプションを使用します。

質問がある場合は、データセットを完全に分割しない数値に対して機能します。

$ ls | LC_ALL=C sort  | xargs -n 3 /path/to/some/script.sh
...
called with file091_d file092_d file093_d
called with file094_d file095_d file096_d
called with file097_d file098_d file099_d
called with file100_d

関連情報