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