내 업무에는 일부 데이터 처리가 포함됩니다. 작업 중 하나는 일련의 디렉터리를 '평면화'하는 것입니다.디렉토리지금은) 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
이것을 쉘 스크립트에 넣고 watch가 이 스크립트를 호출하도록 해야 합니다.
답변4
실행하려는 명령과 sleep 명령이 포함된 while 루프를 사용하면 watch 명령처럼 linux 명령을 반복적으로 실행할 수도 있습니다. 하지만 이 특정한 경우 @peterph의 답변은 종료 조건이 있기 때문에 더 좋습니다. 이 짧은 응답은 동일한 프로세스를 다시 실행할 때 새로 고치는 방법에 대한 질문에만 답변합니다.
while true; do echo $(date +"%T"); sleep 1; done
수면 후의 숫자는 초 단위입니다.