내 업무에는 일부 데이터 처리가 포함됩니다. 작업 중 하나는 일련의 디렉터리를 "평면화"하는 것입니다.목차일시적으로) DirFlat이라는 새 위치에 복사합니다.
시간이 오래 걸릴 수 있습니다(30분 -> 2~3시간)! 진행 상황을 볼 수 있기를 원했기 때문에 find Dir -type f|wc -l
파일 수를 가져온 다음(이렇게 부르겠습니다 $Filenum
) 제가 작성한 매우 짧은 명령을 실행했습니다(내 노트북에서 다시 입력했는데 아마도 복사 오류였을 것입니다. 요점 ):
echo $(echo "($ls DirFlat |wc -l)*100/$FileNum"|bc) "%" $(date)
그러나 실행하면 watch -n 100 "!!"
에코된 출력을 얻고 해당 출력을 계속 인쇄합니다(날짜는 변경되지 않음).
이것을 사용하여 BASH에서 변수를 새로 고치거나 내부 변수에 대한 할당을 다시 실행할 수 있습니까? 이것이 일부 작업을 자동화하는 데 도움이 되기를 바랍니다.
답변1
비교:
$ watch -n 1 "echo $(date)"
Every 1.0s: echo Sat Apr 27 03:10:50 CEST 2013
$ watch -n 1 'echo $(date)'
Every 1.0s: echo $(date)
당신이 하는 일은 and 를 실행 echo "($ls DirFlat |wc -l)*100/$FileNum"|bc
하고 date
각 명령의 출력을 쉘 명령으로 바꾼 watch -n 100 "echo $(…) % $(…)"
다음 실행하는 것 뿐입니다. 명령이 상위 셸에서 확장되는 것을 방지하고 대신 문자열로 전달하여 watch
실행되도록 해야 합니다. 명령 주위에 큰따옴표 대신 작은따옴표를 사용하면 됩니다.
답변2
또는 이를 셸 루프로 래핑할 수 있습니다.
while sleep 100; do
(... your stuff ...)
if [ (... process has finished ...) ]; then
(... beep or get operator's attention otherwise ...)
break
fi
done
답변3
이를 쉘 스크립트에 넣고 해당 스크립트를 호출하도록 감시해야 합니다.
답변4
실행하려는 명령과 sleep 명령을 사용하는 while 루프를 사용하면 watch 명령처럼 Linux 명령을 반복적으로 실행할 수도 있습니다. 하지만 이 특정한 경우에는 종료 조건이 있기 때문에 @peterph의 답변이 더 좋습니다. 이 짧은 응답은 동일한 프로세스를 다시 실행할 때 새로 고치는 방법에 대한 질문에만 답변합니다.
while true; do echo $(date +"%T"); sleep 1; done
수면 후의 숫자는 초 단위입니다.