次の命名規則に従うファイルがたくさんあります。
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
呼び出され、その項目が配列から削除されます。配列が空になるまで続きます。k
files
答え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_d
file9_d
file1_d
file2_d
これらのいくつかを実行するには、GNUzargs
とGNUの両方にxargs
オプションオプションがあります-P
myscript
。
答え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