"/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처음 두 필드(월 및 연도)를 제거 하고 세 번째 필드 이후의 모든 항목을 인쇄합니다.

$month2012년 12월에 수정된 파일을 생성하여 위의 내용을 테스트했습니다("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

관련 정보