UNIX에서 작업을 자동화하고 스크립트를 만들고 싶습니다.
매일 2개의 파일이 나타나는 디렉터리가 있으며, 이 파일들은 오후 10시에서 오전 1시 사이에 언제든지 나타납니다.
파일명은 batm53_20131025_BARC5300001201310240000000200004233.221341696408
.
파일 이름이 세 부분으로 구성되어 있는 경우:
- batm53은 상수입니다
- 파일이 디렉토리에 도착한 날짜
- 이 부분은 BARC5300001201310170000000200004233.221341696408입니다. 여기서 BAR5300001은 상수이고 파일 날짜 이후입니다.
오늘이 10월 24일이고 오전 1시 이후에 파일이 나타난다고 가정하면, 파일 이름의 두 번째 부분은 10월 25일을 표시하지만 BAR5300001 다음 세 번째 부분은 10월 24일 날짜(20131024)를 표시합니다.
이 상황에서 문제가 발생했습니다. 파일이 오후 10시에서 오전 12시 사이에 나타나는 경우 find 명령을 사용하여 스크립트를 간단하게 만들 수 있지만 해당 부분을 만드는 데 문제가 있습니다. 파일은 이전 날짜여야 하고 오전 12시 이후에는 날짜가 변경되어야 하기 때문에 오전 12시 이후에 파일이 도착했는지 어떻게 확인할 수 있나요?
답변1
오전 12시에 "temp" 파일을 만든 다음 최신 파일을 찾아 해당 날짜로 해당 파일의 이름을 바꿀 수 있습니다.
예를 들어:
1 단계
오전 12시 이후에 파일을 생성하려면 다음 명령을 사용하십시오.
$ touch -d "$(date +%F)" temp.file
touch
2013년 10월 26일에 실행한 경우 파일 날짜는 "Oct 26 00:00"이 됩니다.
2 단계
원하는 대로 이전 날짜를 파일에 설정한 다음 이전 날짜를 가져오는 변수를 만듭니다.
$ Yesterday=$(date +%Y%m%d -d '1 day ago')
노트:(이렇게 하면 변수에 "20131025" 값이 저장됩니다.)
3단계
temp.file
이제 우리가 만든 파일보다 최신 파일을 찾을 수 있습니다 .
$ find . -type f -newer temp.file
알겠습니다. 낮 12시 이후에 생성된 파일을 마음껏 시청해 보세요. 이제 이름을 이전 날짜로 바꾸시겠습니까?
$ find . -type f -newer temp.file | \
awk -v y=$Yesterday '{split($0,arr,"_"); \
print "mv -v --",$0, arr[1]"_"y"_"arr[3]}'
위 명령은 첫 번째 파일이 원래 파일 이름이고 두 번째 파일이 원하는 파일인 출력을 인쇄합니다.
출력이 좋아 보인다고 생각되면 | sh
동일한 명령에 추가하십시오.
$ find . -type f -newer temp.file | \
awk -v y=$Yesterday '{split($0,arr,"_"); \
print "mv -v --",$0, arr[1]"_"y"_"arr[3]}' | sh
그러면 두 번째 부분의 이전 날짜를 사용하여 파일 이름이 변경됩니다. 따라서 위 명령의 도움으로 스크립트를 생성한 다음 cron을 사용하여 12시 이후에 실행할 수 있습니다.