많은 파일에서 명령 실행


19

많은 파일 (xyz1, xyz2, xyz5025까지)이있는 폴더가 있으며 xyz1.faa, xyz2.faa 등을 출력으로 가져 와서 각 파일마다 스크립트를 실행해야합니다.

단일 파일의 명령은 다음과 같습니다.

./transeq xyz1 xyz1.faa -table 11

자동으로 수행하는 방법이 있습니까? 아마도 콤보일까요?

답변:


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

이것은 현재 디렉토리에서 for시작하는 모든 파일을 반복 하고 파일 이름을 첫 번째 인수로 사용하고 파일 이름과 ".faa"를 두 번째 인수로 사용하고 그 다음에 "-table 11"을 사용 xyz하여 ./transeq프로그램을 호출 하는 간단한 루프입니다. .


4
또는 단일 라이너로 : for file in xyz*; do ./transeq "$file" "${file}.faa" -table 11; done. 나는 항상 이런 종류의 것을 입력합니다. 당신이 등을 파일 이름, 당신이 원하는 방식으로 확장지고 있는지 확인 싶다면, 그냥 넣어 echo애프터 권리를 do처음으로 다음 쉘 역사에 다시 가서 그에게 두 번째 시간을 삭제합니다.
Dave Tweed

"$file".faa대화식 원 라이너의 일부로 입력하기가 약간 쉬우 며 .faa인용해야 할 쉘 메타 문자가 포함되어 있지 않으므로 안전 합니다.
Peter Cordes

2
참고로 부분 실행으로 끝나고 루프를 다시 시작하려는 경우 xyz* glob는 .faa 파일도 선택합니다. bash의 경우 shopt -s extglob( reference )를 실행 한 다음 for file in xyz!(*.faa) ....faa 파일이 루프를 통해 전송되지 않도록 제외하십시오.
Jeff Schaller

24

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

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

프로그램이 CPU를 많이 사용하는 경우 속도가 약간 빨라집니다.


6

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

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

우리는 1에서 5025까지의 정수를 한 줄씩 생성 한 다음 xargs에 하나씩 공급하여 정수를 캡슐화 {}한 다음 적절한 방식으로 ./transeq 명령 줄에 이식합니다.

중괄호 확장 기능이 없으면 유틸리티를 {n..m}호출하여 seq해당 숫자를 생성 할 수 있습니다.

또는 다음을 통해 항상 숫자 생성을 에뮬레이션 할 수 있습니다.

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

1
너무 복잡합니다. for i in {1..5025}; do ./transeq "xyz$i" "xyz$i".faa -table 11; done생각하고 타이핑하기가 더 쉽습니다. 명령을 실행하기 전에 인쇄하려면을 사용하십시오 set -x.
Peter Cordes

네 맞습니다.하지만 OP가 질문을 공식화 한 방법은 이름이 xyz1 .. xyz5025 인 파일 만 관심이있는 것 같습니다. 따라서 xyz *에 사용하면 부적합한 파일을 거부하는 방법이 필요하다고 생각했습니다. OP가 디렉토리의 모든 파일을 처리하기를 원한다면 왜 1에서 5025를 가져 옵니까? 모든 파일을 규정 된 방식으로 처리하기를 원한다고 말하면됩니다.

1
내가 쓴 루프를보십시오. 그것은 당신과 정확히 같은 결과 for i in {1..5025}를 얻는 데 사용 됩니다 . bash로 작성할 수도 있지만 입력하는 것이 더 빠르기 때문에 일반적으로 범위 구문을 사용합니다 . for ((i=1 ; i<=5025 ; i++)); do ./transeq "xyz$i" "xyz$i".faa -table 11; done{a..b}
Peter Cordes

4

찾기를 사용하여 파일이 디렉토리 안에 흩어져있을 때 유용합니다

find -name "xyz*" -exec ./transeq {} {}.faa -table 11 \;

4

코어가 두 개 이상이고 각 호출이 나머지와 독립적으로 실행될 수 있다고 가정하면 병렬 실행으로 속도가 크게 향상됩니다.

이 작업을 수행하는 비교적 간단한 방법은 다음과 같은 -P매개 변수 를 사용하는 것 xargs입니다. 예를 들어 4 개의 코어가있는 경우

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

이 명령 -n 1xargs각 호출에 대해 목록에서 하나의 인수 만 선택하도록 지시 하고 (기본적으로 많이 전달 함)-P 4 동시에 4 개의 프로세스를 생성 하도록 지시합니다.

IMHO, 당신은이 간단한 경우에 GNU 병렬을 설치할 필요가 없습니다 – xargs충분합니다.


0

당신이 사용할 수있는 xarg

ls | xargs -L 1 -d '\n' your-desired-command

-L 1 한 번에 1 개의 항목을 전달합니다

-d '\n'ls줄 바꿈에 따라 출력 이 분할됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.