생성 날짜가 구체적인 .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
처음 두 필드(월 및 연도)를 제거 하고 세 번째 필드 이후의 모든 항목을 인쇄합니다.
$month
2012년 12월에 수정된 파일을 생성하여 위의 내용을 테스트했습니다("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