내 상황은 다음과 같습니다
나는 이름이 timestep1_i
i의 많은 값을 나타내는 많은 파일을 가지고 있으며, timestep1의 모든 파일을 이라는 프로그램과 병합하려고 합니다 combinefiles
. find | xargs를 사용하여 이 작업을 병렬로(timestep2 timestep3...) 수행하고 싶습니다.
이를 위해 "combine_and_move"라는 bash 함수가 있습니다.
function combine_and_move {
file_name1=`echo $1 | sed 's/timestep1_0/timestep1/'`
echo "*** file $file_name1 ***"
$UTIL_DIR/combinefiles $file_name1 && mv "$file_name1"_* uncombined_files
}
export -f combine_and_move
이 함수는 파일 이름을 받은 다음 모든 파일을 결합하고 이미 결합된 파일을 다른 디렉터리로 이동하는 프로그램을 호출합니다. 마지막 부분은 가 연출을 맡았다고 합니다 &&
.
이제 다음과 같이 find xargs를 사용하여 함수를 호출합니다.
find . -maxdepth 1 -name 'timestep*_0' -print0 | xargs --replace=@ -0 -P 64 bash -c 'combine_and_move $"@"' _ &
시스템 관리자가 프로세스를 무작위로 종료할 수 있음을 이해합니다.
uncombined_files
기능은 작동하지만 가끔 프로세스가 종료되면 해당 폴더 로 파일이 이동되는 경우가 있습니다 .분명히 첫 번째 명령이 성공하지 못하더라도 두 번째 명령이 실행된다는 의미입니다..
내가 뭘 잘못했나요? combinefiles
프로그램이 성공한 경우 에만 merge_and_move 함수가 파일을 이동하도록 하려면 어떻게 해야 합니까 ?
답변1
병합파일이 완료되면 성공 여부에 관계없이 반환 코드가 생성되어야 합니다. mv 명령을 실행하기 전에 이 반환 코드를 테스트하십시오.
예를 들어, 셸에서 "echo $?"를 실행하면 이전 명령의 반환 코드를 볼 수 있습니다. 성공적인 실행의 경우 0이 표시되지만 CTRL-C(SIGINT)를 통해 중지된 명령의 경우 130이 표시됩니다. 많은 종료 코드를 테스트하고 해당 값을 제공한 다음 mv를 실행할지 여부를 결정할 수 있습니다. 자신만의 종료 코드를 지정할 수도 있습니다.
아마도 다음 링크가 도움이 될 것입니다.
https://tldp.org/LDP/abs/html/exit-status.html
https://www.cyberciti.biz/faq/bash-get-exit-code-of-command/