Bash: 배치 파일을 Python 스크립트에 전달

Bash: 배치 파일을 Python 스크립트에 전달

어떤 방식으로든 텍스트 파일을 처리하기 위해 여러 텍스트 파일이 있는 경로를 사용하는 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

GNU xargs와 프로세스 교체를 지원하는 셸(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할 수도 있습니다 .zshn

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

관련 정보