많은 파일에 대해 명령 실행

많은 파일에 대해 명령 실행

많은 파일(xyz1, xyz2, 최대 xyz5025)이 포함된 폴더가 있고 각 파일에서 스크립트를 실행하여 xyz1.faa, xyz2.faa 등을 출력으로 가져와야 합니다.

단일 파일에 대한 명령은 다음과 같습니다.

./transeq xyz1 xyz1.faa -table 11

이 작업을 자동으로 수행하는 방법이 있나요? 어쩌면 for-do 조합일까요?

답변1

for file in xyz*
do
  ./transeq "$file" "${file}.faa" -table 11
done

이것은 첫 번째 인수로 파일 이름, 두 번째 인수로 ".faa", 그 뒤에 "-table 11 "로 시작하는 프로그램을 호출하는 현재 디렉터리의 모든 파일을 for반복하는 간단한 루프입니다. .xyz./transeq

답변2

설치하면GNU 병렬다음과 같이 병렬로 수행할 수 있습니다.

parallel ./transeq {} {}.faa -table 11 ::: xyz*

프로그램이 CPU를 많이 사용한다면 속도가 많이 빨라질 것입니다.

답변3

명령줄에서 다음과 같은 작업을 수행할 수 있습니다 bash.

printf '%s\n' {1..5025} | xargs -l -I {} -t ./transeq xyz{} xyz{}.faa -table 11

우리는 1부터 5025까지의 정수를 한 줄에 하나씩 생성한 다음 xargs에 하나씩 입력합니다. xargs는 정수를 래핑 {}하고 적절한 방식으로 ./transeq 명령줄로 포팅합니다.

버팀대 확장 도구가 없는 경우 이 유틸리티를 호출하여 이러한 숫자를 생성할 {n..m}수 있습니다 .seq

또는 다음을 통해 언제든지 수치 생성을 시뮬레이션할 수 있습니다.

yes | sed -n =\;5025q | xargs ...

답변4

여러 개의 코어가 있고 각 호출이 나머지 호출과 독립적으로 실행될 수 있다고 가정하면 병렬로 실행하면 상당한 속도 향상을 얻을 수 있습니다.

비교적 간단한 방법은 매개변수를 사용하는 것입니다 -P. xargs예를 들어 코어가 4개인 경우:

echo xyz{1..5025} | \
    xargs -n 1 -P 4 -I{} /path/to/transeq xyz{} xyz{}.faa -table 11

목록에서 하나의 매개변수만 선택하도록 각 -n 1호출에 지시합니다.xargs(기본적으로 많이 전달됩니다), -P 44개의 프로세스를 동시에 생성하도록 지시합니다. 하나의 프로세스가 종료되면 새 프로세스가 생성됩니다.

IMHO, 이 간단한 경우에는 GNU Parallel을 설치할 필요가 없습니다 xargs. 그것으로 충분합니다.

관련 정보