디렉터리의 파일에 대해 for 루프를 수행할 때 패턴을 사용하는 방법

디렉터리의 파일에 대해 for 루프를 수행할 때 패턴을 사용하는 방법

저는 bash 스크립팅의 초보자입니다. 다음에 대한 도움이 필요합니다. inotifywait를 사용하여 디렉터리를 모니터링하는 스크립트가 있습니다. 또 다른 프로세스는 밤새 csv 파일을 삭제합니다. 이 파일의 형식은 다음과 같습니다.파일명_YYYYMMDD.csv. 내 스크립트는 가장 오래된 타임스탬프 파일을 가져와서 이름을 바꿉니다.파일 이름.csv이므로 다른 외부 프로세스에서 사용할 준비가 되었습니다. 완벽한 세상에서는 파일이 들어와 타임스탬프 없이 이름이 변경된 다음 처리됩니다. 외부 프로세스가 파일을 보관 폴더로 이동합니다. 외부 프로세스가 닫히면 타임스탬프가 있는 파일이 폴더에 누적됩니다. 내 스크립트는 디렉터리에 액세스할 때 첫 번째 파일의 이름을 바꾸지만 나머지 파일은 첫 번째 파일이 보관될 때까지 변경되지 않은 상태로 유지됩니다. 그런 다음 내 스크립트는 가장 오래된 파일을 찾아 이름을 바꾸고 종료합니다.

타임스탬프가 있는 파일이 디렉터리에 처음 액세스하면 내 스크립트는 이름의 타임스탬프를 확인합니다.

regex='_[0-9]{4}[0-9]{2}[0-9]{2}(.csv)$'
if [[ $file =~ $regex ]]; then

이것은 훌륭하게 작동합니다. 라는 파일이 있는지 확인합니다.파일 이름.csv. 그렇지 않은 경우 파일 이름이 변경됩니다.

파일을 처리하고 보관할 때 스크립트는 파일이 사라진 것을 감지하고 기본 이름을 가져온 다음 해당 기본 이름과 일치하는 다음으로 가장 오래된 파일을 찾아 이름을 바꾸고 종료합니다.

마지막으로 도움이 필요한 곳이 바로 여기입니다. 패턴과 일치하는 가장 오래된 파일을 찾으려면 다음 코드를 어떻게 수정합니까? 기본 이름만 찾고 있다면 다음과 같은 잘못된 형식의 파일 이름을 선택합니다.파일명_YYMM, 그건 내가 원하지 않는 것입니다.

unset -v oldest
for f in $mybasename*; do
   [[ -z $oldest || $f -ot $oldest ]] && oldest=$f
done

이제 $mybasename은파일 이름. 다음과 같은 정규식을 어떻게 사용할 수 있습니까?

regex='$mybasename_[0-9]{4}[0-9]{2}[0-9]{2}(.csv)$'
for f in $regex; do
   [[ -z $oldest || $f -ot $oldest ]] && oldest=$f
done

감사해요!

관련 정보