何らかの方法でテキストファイルを処理するために複数のテキストファイルを含むパスを使用するPythonスクリプトがあります。ファイルが多すぎるため、bashスクリプトを使用してパス内の一部のファイルをまとめて(たとえば、一度に100個ずつ)渡したいと思います。これを行う簡単な方法はありますか?たとえば、私のスクリプトは現在
python application.py -fp [path to all files]
Bashスクリプトを作成できますか?
python application.py -fp [file-1:file-100]
そして次のループで
python application.py -fp [file-101:file-200]
など?
編集する:
bashを使ってStephaneのソリューションを試しましたが、それはほとんどうまくいくと思いますが、まだファイルのサブセットを取得できません
Bashスクリプトのパラメータからパスを取得するには、これを実行します。
set -- "$fp*.txt"
echo "${@}"
明らかにする
../../files_test/pair/*.txt
これが私が得なければならないファイルへのパスであるので正しいです。しかし、私はこれをしました。
files=${@:1:2}
echo $files
最初のファイルをインポートできるかどうかをテストするためのものですが、ディレクトリ内のすべてのファイルのリストが表示されます。私は何を逃したことがありませんか?
編集2:
それは問題ではありません。私がやっていることに気づいた
set -- "$fp*.txt"
変える
set -- $fp*.txt
今大丈夫です。
ベストアンサー1
GNUxargs
とプロセスの交換をサポートするシェル(ksh、bash、zsh)を使用すると、次のことができます。
xargs -r0 -n100 -a <(printf '%s\0' ./*) python application.py -fp
例:
$ xargs -r0n4 -a <(printf '%s\0' {1..20}) echo
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
プロセスを交換せずに次のこともできます。
printf '%s\0' ./* | xargs -r0 -n100 -python application.py -fp
しかし、これはstdinがapplication.py
基本的にプロセス交換を手動で実装することで解決できる/dev/null
システムの問題であることを意味します。/dev/fd/xxx
{
printf '%s\0' ./* |
xargs -a /dev/fd/3 3<&0 <&4 4<&- -r0 -n100 -python application.py -fp
} 4<&0
そしてzsh
:
autoload zargs
zargs -l 100 ./* -- python application.py -fp
例:
$ zargs -l4 {1..20} -- echo
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
いつでも次のことができます(ksh93/bash/zsh):
set -- ./*
while (($# > 0)); do
python application.py -fp "${@:1:100}"
shift "$(($# >= 100 ? 100 : $#))"
done
例:
$ set -- {1..20};while (($#>0));do echo "${@:1:4}";shift "$(($#>4?4:$#))";done
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20
ファイルが実際に呼び出されている場合file-1
...数字でソートしたいファイルのリストに(数字をソートするために)glob修飾子を使用する必要がfile-2
あるかもしれません。zsh
n
zargs -l 100 ./*(n) -- python application.py -fp
sort -zV
または、次の出力でGNU(バージョンソート用)を使用してくださいprintf '%s\0'
。
xargs -r0 -n100 -a <(printf '%s\0' ./* | sort -zV) python application.py -fp