나는 foo.xml 파일을 가져 와서 foo.txt 파일을 작성할 펄 스크립트 (또는 어떤 실행 파일)도 가지고있다. Beowulf 클러스터를 사용하여 많은 수의 XML 파일에 대해 E를 실행하지만 기존 txt 파일을 덮어 쓰지 않는 쉘 (bash)에 간단한 작업 서버 스크립트를 작성하고 싶습니다.쉘 스크립팅 : 검색/바꾸기 및 체크 파일이 존재 함
나는 현재
#!/bin/sh
PATTERN="[A-Z]*0[1-2][a-j]"; # this matches foo in all cases
todo=`ls *.xml | grep $PATTERN -o`;
isdone=`ls *.txt | grep $PATTERN -o`;
whatsleft=todo - isdone; # what's the unix magic?
#tack on the .xml prefix with sed or something
#and then call the job server;
jobserve E "$whatsleft";
같은 것을하고 있어요 그리고 나는 $의 할 일 및 $의 isDone의 차이를 가져 오는 방법을 모른다. grep을 사용하여 for 루프 같은 것을 sort/uniq을 사용하는 것이 더 좋겠지 만, 어떻게해야 할 지 모르겠다. (파이프? 임시 파일?)
보너스 질문으로, bash grep에서 lookahead 검색? 나는 (반드시 그런 것은 아니지만) 데이터/{지점}/특수/{패턴} .XML 같은 소스로부터 입력을 다른 출력을 쓰기 프로그램의 무리가
:
는 확장/문제를 명확히하기 위해 디렉토리 결과/특수/{분기} - {패턴} .txt (또는 데이터/{분기}/중간/{패턴} .dat). 그 파일이 이미 존재한다면 jobfarming 쉘 스크립트를 체크인하고 싶습니다.그래서 E는 데이터/{branch}/special/{pattern} .xml-> 결과/특수/{branch} - {pattern} .dat를 변환합니다. 각 입력 인스턴스를보고 출력이 존재하는지 확인하고 싶습니다. 이 작업을 수행하는 한 가지 방법은 각 입력 파일 옆의 * .done 파일을 터치하고 그 결과를 확인하는 것입니다. 그러나이를 관리하지 않는 것이 좋으며, 때로는 작업이 부적절하게 종료되어 필자가 원하지 않을 수도 있습니다. 완료로 표시됩니다.
N.B. 동시성을 확인하거나 파일을 잠글 필요가 없습니다.
그래서 (의사 코드) 위의 문제를 해결하기 위해 간단하고 명확한 방법은
for i in `/bin/ls *.xml`
do
replace xml suffix with txt
if [that file exists]
add to whatsleft list
end
done
수 있습니다하지만 난 더 일반적인 뭔가를 찾고 있어요.
'txtfile = $ {XMLFILE의 %의 .XML}는 대체됩니까 .txt' - 내 대답에있다. –
"파일 덮어 쓰기를 피하려면"동시성을 인식해야합니까? 그렇다면 잠금을 수행해야합니다. (그렇다면 ... 우리는 공유 파일 시스템에 있습니까? 어느 것이 있습니까?'flock '에 대한 적절한 의미가 있습니까?) –
동시성 인식이없고 잠금이 없습니다 - 공유 파일 시스템이지만 이것은 부수적 인 프로젝트입니다 for now – johndashen