특정 날짜에 대한 파일 필터링

특정 날짜에 대한 파일 필터링

내 운영 체제는 Solaris 10(64비트)이고 로그 디렉터리에 많은 파일이 있으며 매일 40-50개의 로그를 받습니다. 이 디렉토리에 지난 20일 동안의 파일이 있고 파일 날짜가 추가된 이름의 특정 디렉토리로 매일 파일을 이동하고 싶습니다.

예를 들어

File_name  date
1.txt      31-jul-20122 
2.txt      01-Aug-2012

그런 다음 2012년 7월 31일의 이전 파일에 대한 디렉터리를 만들고 새 디렉터리 31-jul RIO_31-Jul-2012로 이동하여 8월 1일의 파일과 동일하게 이동합니다.

현재 날짜에 잘 작동하는 스크립트를 작성했지만 이전 날짜에 맞게 수정하는 방법을 모르겠습니다.

내 스크립트는 다음과 같습니다

NEWDIR=RIO_31-Jul-2012
mkdir /ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/$NEWDIR
cd /var/opt/ers/logs/rio
touch -t `date +%Y%m%d0000` dummy
find . -newer dummy -type f  |
while read fname
do
    mv $fname /ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/$NEWDIR
done

답변1

Solaris에서는 ls -E.

로그 디렉터리의 모든 파일을 반복합니다. 각 파일에 대해 날짜를 가져오고 필요한 경우 대상 디렉터리를 만든 다음 파일을 이동합니다.

for f in /var/opt/ers/logs/rio/*; do
  ymd=$(ls -Eog "$f" | awk '{print $4}')
  target=/ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/RIO_$ymd
  mkdir -p "$target"
  mv "$f" "$target"
done

아카이브 디렉토리의 이름은 와 같은 형식이 됩니다 RIO_2012-07-31. RIO_31-Jul-2012시간순으로 정렬되므로 YMD 형식을 권장합니다. 축약된 월 이름과 DMY 순서가 정말로 필요한 경우 ls -e대신 사용 ls -E하고 그에 따라 awk 호출을 변경하십시오.

  mdy=$(ls -eog "$f" | awk '{print $5 "-" $4 "-" $7}')

하위 디렉터리에서 파일을 반복적으로 찾아야 하는 경우 find모든 파일을 반복한 다음 각 파일을 다시 실행하는 셸 조각을 호출하세요.

find /var/opt/ers/logs/rio -type f -exec sh -c '
  ymd=$(ls -Eog "$0" | awk "{print \$4}")
  target=/ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/RIO_$ymd
  mkdir -p "$target"
  mv "$0" "$target"
' {} \;

before 를 사용하면 before를 추가하여 보다 오래된 파일만 일치시킬 find수 있습니다 . 최소 42일 전에 수정된 일치하는 파일 만 추가할 수 있습니다 .! -newer somefile-execsomefile-mtime 42

답변2

ctime 또는 atime을 통해 파일을 찾은 다음 나열된 파일을 올바른 디렉터리로 이동할 수 있습니다.

find . -iname "*.txt" -ctime -<daysago> -type f

"일 전"은 정수입니다.

관련 정보