"/usr/bin/stat: 인수 목록이 너무 깁니다" 오류

"/usr/bin/stat: 인수 목록이 너무 깁니다" 오류

생성 날짜가 특정 .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"

완료!

이미 변수가 있으므로 다음 yearmonth같이 작성하는 것이 간단합니다.

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월" 및 $year2012년으로 설정).

$ 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

관련 정보