내 쉘 스크립트는 다음과 같습니다.
#!/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 목록을 메모리에 보관할 필요가 없습니다.