Bash는 두 개의 파일 세트를 반복합니다.

Bash는 두 개의 파일 세트를 반복합니다.

두 폴더를 반복하고 파일을 Python 프로그램으로 실행하는 bash 스크립트를 작성하려고 합니다. Python 프로그램은 두 개의 입력 파일(각 폴더의 해당 파일)을 받아들이고 하나의 파일을 출력합니다.

다음과 같이 보입니다.

folder 1/
    Run_1.out
    Run_2.out
    Run_3.out
    ...
folder 2/
    Sym_1.g0.out
    Sym_2.g0.out
    Sym_3.g0.out
    ...

Python 프로그램은 해당 입력(예: Run_1.outSym_1.g0.out)을 가져와 다음과 같은 파일을 출력합니다.

    NOCI.py Run_1.out Sym_1.g0.out outputfile

파이썬 프로그램은 터미널을 통해 한 쌍의 파일을 사용할 때 잘 작동하는데, 360쌍의 파일이 있기 때문에 스크립트를 사용해야겠다는 생각이 들었습니다. 지금까지 두 개의 for 루프를 작성해 보았지만 작동하지 않는 것 같습니다.

    #!/bin/bash
    FILE1=*.out
    FILE2=*.g0.out
    for i in $FILE1
    do
        for j in $FILE2
            do
                NOCI.py $i $j ${i}_${outputfile}
        done
    done

답변1

match folder 1/Run_1.outfolder 2/Sym_1.g0.out360개 쌍에 대해 다음과 같습니다.

for n in {1..360}
do
    NOCI.py "folder 1/Run_$n.out" "folder 2/Sym_$n.g0.out" outputfile
done

또는 페어링된 파일의 순서가 잘못된 경우 파일을 선택 Run_N.out하고 해당 Sym_N.g0.out파일을 연결할 수 있습니다.

for r in "folder 1/Run_"*.out
do
    n="${r#folder 1/Run_}"; n="${n%.out}"
    s="folder 2/Sym_$n.out"
    NOCI.py "$r" "$s" outputfile
done

답변2

zshbash이 유형의 작업보다 더 적합합니다.

#! /bin/zsh -
files1=(1/*.out(n)) files2=(2/*.go.out(n))
for f1 f2 (${files1:^files2}) NOCI.py $f1 $f2 3/$f1:t:r+$f2:t
  • (n)숫자순으로 처리되도록 글로브를 숫자순으로 정렬합니다( Run_10포함 및 제외 Run_9Run_11아닌 포함 Run_1Run_2제외).
  • ${array1:^array2}: 두 개의 배열을 압축합니다.
  • $file:t:파일의 꼬리(기본 이름)
  • $filr:r:루트 부분(확장 제거).

그래서 우리는 결국 다음을 실행하게 됩니다:

NOCI.py 1/Run_1.out 2/Sym_1.g0.out 3/Run_1+Sym_1.g0.out
NOCI.py 1/Run_2.out 2/Sym_2.g0.out 3/Run_2+Sym_2.g0.out
...

답변3

GNU Parallel을 사용하면 다음을 수행할 수 있습니다.

parallel NOCI.py {1} {2} {1.}{2.}.output ::: Folder1/* ::: Folder2/*

기본적으로 각 CPU 스레드는 하나의 작업을 병렬로 실행합니다.

무엇이 실행될지 보려면 다음을 사용하십시오 --dry-run.

parallel --dry-run NOCI.py {1} {2} {1.}{2.}.output ::: Folder1/* ::: Folder2/*

GNU Parallel은 동일한 컴퓨터 또는 SSH를 통해 액세스할 수 있는 여러 컴퓨터에서 작업을 병렬로 쉽게 실행할 수 있게 해주는 범용 병렬 처리기입니다.

4개의 CPU에서 32개의 서로 다른 작업을 실행하려는 경우 병렬화하는 간단한 방법은 각 CPU에서 8개의 작업을 실행하는 것입니다.

간단한 스케줄링

대신, GNU Parallel은 작업이 완료되면 새로운 프로세스를 생성하여 CPU를 활성 상태로 유지하여 시간을 절약합니다.

GNU 병렬 스케줄링

설치하다

보안상의 이유로 패키지 관리자를 사용하여 GNU Parallel을 설치해야 하지만 GNU Parallel이 배포용으로 패키지되어 있지 않은 경우 루트 액세스가 필요하지 않은 개인 설치를 수행할 수 있습니다. 이 작업은 10초 안에 완료할 수 있습니다.

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 883c667e01eed62f975ad28b6d50e22a
12345678 883c667e 01eed62f 975ad28b 6d50e22a
$ md5sum install.sh | grep cc21b4c943fd03e93ae1ae49e28573c0
cc21b4c9 43fd03e9 3ae1ae49 e28573c0
$ sha512sum install.sh | grep da012ec113b49a54e705f86d51e784ebced224fdf
79945d9d 250b42a4 2067bb00 99da012e c113b49a 54e705f8 6d51e784 ebced224
fdff3f52 ca588d64 e75f6033 61bd543f d631f592 2f87ceb2 ab034149 6df84a35
$ bash install.sh

다른 설치 옵션은 다음을 참조하세요.http://git.savannah.gnu.org/cgit/parallel.git/tree/README

더 알아보기

더 많은 예시 보기:http://www.gnu.org/software/parallel/man.html

소개 비디오 보기:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

이 튜토리얼을 살펴보세요:http://www.gnu.org/software/parallel/parallel_tutorial.html

이 책을 읽어보세요:https://doi.org/10.5281/zenodo.1146014

지원을 받으려면 이메일 목록에 가입하세요.https://lists.gnu.org/mailman/listinfo/parallel

관련 정보