for 루프에서 "매개변수 목록이 너무 깁니다"

for 루프에서 "매개변수 목록이 너무 깁니다"

내 쉘 스크립트는 다음과 같습니다.

#!/bin/bash

for file in *.fasta
do

signalp $file > $file.txt

done

작업 폴더에는 18.000개의 .fasta 파일이 있습니다. signalp 프로그램을 통해 각 프로그램을 실행하고 싶습니다. 폴더에 파일이 너무 많은 것 같은데 코드를 조정하는 방법을 모르겠습니다. 도움이 필요하세요?

답변1

당신은 그것을 사용할 수 있습니다 find:

find . -maxdepth 1 -type f -exec sh -c 'signalp "$1" >"$1".txt' _ {} \;
  • -maxdepth 1현재 디렉터리( )에 있는 find파일만 검색합니다 .-type f

  • sh -c 'signalp "$1" >"$1".txt'signalp발견된 모든 파일에 대해 명령이 실행되고 출력은 .txt원래 파일 이름을 추가한 후 이름의 파일에 저장됩니다.

답변2

당신은 얻을 것이다argument list too long오류는 귀하의 주장을 인용하지 않았기 때문에 발생합니다. 확장이 진행 중입니다. 단정하기는 어렵습니다.무엇$file그것은 - 그것이 생산하는 가치더 많은 주장. 내 이론은 파일 이름 중 하나에 *일치하는 모든 파일과 다시 일치하도록 다시 확장되는 다른 파일 이름이 포함되어 있다는 것입니다.

할 수 있는이 작업을 셸에서 수행하면 전체를 호출할 필요가 없습니다.새로운Shell via find도 이 작업을 수행할 수 있습니다.

이렇게 하세요:

for f in ./*.fasta
do  signalp "$f" >"$f.txt"
done

...바라보다? 큰따옴표는 반복 가능한 쉘 변수의 내용이 확장 가능한 메타 문자를 $f포함하더라도 문자 그대로 해석되지 않는 방식으로 해석되는 것을 방지합니다 $f.

하지만, 이건 사실이다.아니요18k 파일 그룹을 위한 최상의 솔루션입니다. 그것~ 할 것이다작동하지만 일괄 처리할 수 있다면 더 좋을 것입니다.더 멀리.

예를 들어, 어떤 것이 있다고 가정해보자.주문하다파일 이름 자체. 아마도 이름이 이렇지 않을까...

aaa001.fasta
...
bbb001.fasta

등. 이 경우 다음을 수행할 수 있습니다.

for l in a b c d e f g h i j k l m n o p q r s t u v x y z
do    for  f in "./$l$l$l"*.fasta
      do   singalp "$f" >"$f.txt"
done; done

...따라서 루프 중에 전체 18k 목록을 메모리에 보관할 필요가 없습니다.

관련 정보