
생성 날짜가 특정 .log/.lst
디렉토리( )에 있는 파일( ) 목록을 가져와야 합니다 .$logfolder
$year
$month
stat --format='%y %n' $logfolder/* |
grep "$year-$month-"|
awk -F' ' '{print $4}'|
grep 'log$\|lst$' > $archivepath/filesToArchive
파일이 너무 많은 폴더에 명령을 쿼리하면 작동하지 않습니다. 다음 오류가 발생합니다.
-bash: /usr/bin/stat: Argument list too long
답변1
재미있는 가능성을 위해 핸들 find
이 있으면 -newerXY
사용하세요! 예를 들어 1977년과 10월의 파일을 가져오려면 다음을 수행합니다.
find "$logfolder" \( -name '*.log' -o -name '*.lst' \) -newermt "1977-10-01" \! -newermt "1977-10-01 +1 month"
완료!
이미 변수가 있으므로 다음 year
과 month
같이 작성하는 것이 간단합니다.
find "$logfolder" \( -name '*.log' -o -name '*.lst' \) -newermt "$year-$month-01" \! -newermt "$year-$month-01 +1 month"
명령 은 단 하나 find
! 놀라운!
답변2
나는 이렇게 할 것입니다 :
find "$logfolder" \( -name '*.log' -o -name '*lst' \) -printf "%TB\t%TY\t%p\n" |
awk '$1==m && $2==y' m="$month" y="$year" | cut -f 3-
설명
두 -name
호출을 괄호로 그룹화하여 (또는) 플래그와 결합할 수 있습니다 -o
. 그러면 또는 파일이 find
검색 됩니다 . (GNU 확장자) 는 파일의 수정 월( ), 수정 연도( ), 경로( )를 인쇄하며 각 필드 사이에는 탭( )이 있습니다 ..log
.lst
-printf
%TB
%TY
%p
\t
단순히 awk
첫 번째 필드(월)가 와 같고 $month
두 번째 필드가 와 같은지 확인합니다 $year
.
cut
처음 두 필드(월 및 연도)를 제거하고 세 번째 필드부터 모든 내용을 인쇄합니다 .
2012년 12월에 수정된 파일을 생성하여 위의 내용을 테스트했습니다( $month
"12월" 및 $year
2012년으로 설정).
$ touch -d "December 13 2012" {a,b,c}{.lst,.log}
$ touch c.lst a.log ## c.lst and a.log now have today's modification date.
$ find $logfolder \( -name '*.log' -o -name '*lst' \) -printf "%TB\t%TY\t%p\n" |
awk '$1==m && $2==y' m="$month" y="$year" | cut -f 3-
./b.log
./c.log
./b.lst
./a.lst
(파일 및 디렉터리 이름에 개행 문자가 포함되어 있지 않다고 가정합니다.)
답변3
이 시도:
find $logfolder -type f -exec stat --format='%y %n' "{}" + |
grep "$year-$month-"|
awk -F' ' '{print $4}'|
grep 'log$\|lst$' > $archivepath/filesToArchive
답변4
ls -lh *.log *.lst logfolder | grep year | grep month