find에서 n번째 결과를 얻는 방법은 무엇입니까?

find에서 n번째 결과를 얻는 방법은 무엇입니까?

1나는 각 병렬 작업에 에서 까지의 정수 ID ( 아래 예에서 n내가 알고 있는 값 ) 를 제공하는 작업 스케줄러(Slurm)가 있는 분산 컴퓨팅/서버 팜에 액세스할 수 있습니다 .nn = 10

저는 find -maxdepth 1 -name '2019 - *'프로그램에 인수로 전달할 파일 이름 목록을 찾는 데 사용합니다.

예시 파일 이름:

2019 - Alphabet
2019 - Foo Bar
2019 - Reddit
2019 - StackExchange

순서는 중요하지 않습니다. 일치하는 모든 파일은 한 번만 사용할 수 있습니다.

다음은 사용할 수 있는 "템플릿" 스크립트의 예입니다.

#!/bin/bash

# in this case, from i = 1 to i = 10
#SBATCH --array=1-10

# pseudocode begins
    # it is given that filename_array has 10 unique elements
    filename_array="$(find -maxdepth 1 -name '2019 - *')"

    # SLURM_ARRAY_TASK_ID is the value of i, from i = 1 to i = 10
    filename=filename_array[$SLURM_ARRAY_TASK_ID]
# pseudocode ends

./a.out "$filename"

이것이 수행하는 작업입니다(그러나 각 프로세스는 다른 시스템에서 병렬로 실행됩니다).

./a.out "./2019 - Alphabet" &
./a.out "./2019 - Foo Bar" &
./a.out "./2019 - Reddit" &
./a.out "./2019 - StackExchange" &

주어진 각 파일 이름에 대해 템플릿 스크립트를 한 번씩 실행하는 bash 스크립트를 어떻게 작성할 수 있습니까 find -maxdepth 1 -name '2019 - *'?

답변1

find특히 현재 디렉토리의 파일에만 관심이 있는 경우에는 를 사용하는 것이 실수일 수 있습니다. 쉘 글로브 모드를 사용할 수 있습니다.

#/bin/sh

for f in '2019 - '*
do
    [ -f "$f" ] && ./a.out "$f" &
done

파일로 테스트하는 것은 이식성을 위한 것입니다. 를 사용하는 경우 일치하지 않는 패턴을 자체 대신 없음으로 확장하여 일치하는 파일이 없는 경우 루프가 한 번이 아닌 0번 실행되도록 할 수 있습니다 bash. shopt -s nullglob그러나 이식성이 좋으며 디렉터리 이름이 패턴과 일치하는 등의 상황을 처리할 수 있습니다.

분명히 필요한 것은 "템플릿 스크립트"이지만 그것이 의미하는 바는 제한적으로 이해하고 있습니다.

아마도

#!/bin/bash
# magic string for slurm to run on 10 hosts
#SBATCH --array=1-10

filename_array=( '2019 - '* )
filename=${filename_array[$SLURM_ARRAY_TASK_ID-1]}
./a.out "$filename"

그것은 무엇입니까?

편집: 또 다른 요구 사항이 변경되었습니다. 패턴에 대한 정규식을 지원합니다.

#!/bin/bash
# magic string for slurm to run on 10 hosts
#SBATCH --array=1-10

readarray -d '' filename_array < <( find . -maxdepth 1 -regex '.*2019 -.*' -print0 | sort -z )
filename=${filename_array[$SLURM_ARRAY_TASK_ID-1]}
./a.out "$filename"

답변2

당신은 그것을 사용할 수 있습니까 $SLURM_JOB_NODELIST?

이 경우 GNU Parallel이 확실한 해결책처럼 보입니다.

find -maxdepth 1 -name '2019 - *' |
  parallel --slf $SLURM_JOB_NODELIST --wd . ./a.out {}

관련 정보