![특정 날짜에 대한 파일 필터링](https://linux55.com/image/24266/%ED%8A%B9%EC%A0%95%20%EB%82%A0%EC%A7%9C%EC%97%90%20%EB%8C%80%ED%95%9C%20%ED%8C%8C%EC%9D%BC%20%ED%95%84%ED%84%B0%EB%A7%81.png)
내 운영 체제는 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
-exec
somefile
-mtime 42
답변2
ctime 또는 atime을 통해 파일을 찾은 다음 나열된 파일을 올바른 디렉터리로 이동할 수 있습니다.
find . -iname "*.txt" -ctime -<daysago> -type f
"일 전"은 정수입니다.