다음 쉘 스크립트는 20MB보다 큰 모든 파일을 어떻게 찾나요?

다음 쉘 스크립트는 20MB보다 큰 모든 파일을 어떻게 찾나요?

다음과 같이 하면 크기가 20Mb보다 큰 파일을 모두 찾을 수 있다는 기사를 봤습니다.

find / -type f -size +20000k -exec ls -lh {} \; 2> /dev/null   | awk '{ print $NF ": " $5 }'  | sort -hrk 2,2

작동하는 것 같지만 '+20000k' 이후에 무엇을 하는지 이해가 되지 않습니다.

답변1

find / -type f -size +20000k -exec ls -lh {} \; 2> /dev/null   | awk '{ print $NF ": " $5 }'  | sort -hrk 2,2
  • /: 홈 디렉터리에서 시작 찾기
  • -type f: 일반 파일만 찾기
  • -size +20000k: 크기가 20000k 이상입니다.
  • -exec ls -lh {} \;: 발견된 각 파일에 대해 실행됩니다 ls -lh. 즉, 긴 형식과 사람이 읽을 수 있는 크기(접미사 "K", "M", "G" 등 포함)로 나열합니다.
  • 2>/dev/null: find오류 메시지가 생성되면 블랙홀로 리디렉션합니다.
  • |: find결과를 다음 명령으로 파이프합니다(이 경우 awk).
  • awk '{print $NF ": " $5}':출력의 마지막 필드, ls -lh콜론, 다섯 번째 필드를 인쇄합니다. 마지막 필드는 파일 이름이고 다섯 번째 필드는 파일 크기(앞서 언급한 사람이 읽을 수 있는 형식)입니다.
  • |: 결과를 다시 파이프합니다(이번에는 에서 awk까지 sort).
  • sort -hrk 2,2: 두 번째 필드만 고려하여 사람이 읽을 수 있는 숫자를 기준으로 역순으로 결과를 정렬합니다.

노트

awk및 명령을 사용하지 않고도 이 작업을 더 쉽고 빠르게 수행할 수 있습니다 sort.

find / -type f -size +20000k -exec ls -Shs {} +

어디

  • ls -Shs: 파일을 나열하고 크기별로 정렬하면서 사람이 읽을 수 있는 형식으로 크기를 인쇄합니다.
  • {} +찾은 파일을 find목록에 추가하고 ls전체 목록의 마지막에만 수행하십시오. 각 파일을 {} \;개별적으로 실행하는 경우 .ls

이 두 명령의 유일한 차이점은 전자의 경우 크기가 두 번째 열에 인쇄되는 반면 후자의 경우 첫 번째 열에 인쇄된다는 것입니다. 그러나 파일 또는 디렉터리 이름에 공백이 포함되어 있으면 ls -l출력에는 파일마다 다른 수의 열이 있으므로 출력은 awk다소 무작위가 됩니다. 다시 말해서ls의 출력을 구문 분석하면 안 됩니다..

답변2

이것

-exec ls -lh {} \;

ls -lhfind는 발견된 각 파일에 대해 명령을 실행합니다 {}. ' \;'는 각 파일에 개별적으로 명령을 제공한다는 의미입니다. 매뉴얼 페이지에서:

   -exec command ;
          Execute command; true if 0 status is returned.   All  following
          arguments  to  find  are  taken  to be arguments to the command
          until an argument consisting of `;' is encountered.  The string
          `{}'  is  replaced  by  the  current  file name being processed
          everywhere it occurs in the arguments to the command, not  just
          in  arguments  where  it is alone, as in some versions of find.
          Both of these constructions might need to be  escaped  (with  a
          `\')  or  quoted  to  protect them from expansion by the shell.
          See the EXAMPLES section for examples of the use of  the  -exec
          option.   The  specified  command  is run once for each matched
          file.  The command  is  executed  in  the  starting  directory.
          There  are unavoidable security problems surrounding use of the
          -exec action; you should use the -execdir option instead.

2> /dev/null섹션에서는 오류(예: 읽을 수 없는 디렉터리)가 삭제되었는지 확인합니다( /dev/null).

ls -lh파일의 실제 출력은 다음과 같습니다.

-rw-rw-r--  1 anthon users   1,2K Aug 24  2013 sizes.data1

awk그런 다음 파일 이름(NF는 필드 수를 나타냄)과 5번째 필드(예: sizes.data1: 1.2K:)를 추출하는 명령을 입력합니다.

이러한 이름:크기 조합은 sort두 번째 필드( ) -k 2,2의 정렬 로 파이프됩니다. 정렬을 위한 -h는 역방향 ls -lh정렬을 위한 -h의 출력과 일치합니다 -r.

답변3

-exec ls -lh {} \; /dev/empty

20MB보다 큰 각 파일에 대해 -l 및 -h 옵션과 함께 ls 명령을 실행하고 오류를 /dev/null로 리디렉션합니다.

    -l     use a long listing format

    -h, --human-readable
          with -l, print sizes in human readable format (e.g., 1K 234M 2G)

그러면 다음과 같은 출력이 생성됩니다.

-rw-r--r--. 1 루트 루트 58M 2012년 10월 15일/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/rt.jar

awk 명령:

awk '{ 인쇄 $NF ": " $5 }'

파일 이름과 크기를 인쇄합니다. $NF는 마지막 열을 나타내고 $5는 다섯 번째 열을 나타냅니다.

/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/rt.jar:58M

마지막 명령:

정렬 시간 2,2

두 번째 열(예: 크기)을 역방향 정렬합니다.

   -h, --human-numeric-sort
          compare human readable numbers (e.g., 2K 1G)
   -r, --reverse
          reverse the result of comparisons
   -k, --key=POS1[,POS2]
          start a key at POS1 (origin 1), end it at POS2 (default end of line)

답변4

find의 -printf를 사용하여 단순화할 수 있습니다.

find . -type f -size +20k -printf "%h/%f: %kk\n" | sort -hrk 2,2

그러나 %s와 %k 사이의 미묘함을 이해하려면 find 맨페이지를 읽어보세요. (/에서 검색을 거부하고 테스트용으로 크기를 +20M에서 +20k로 줄였습니다.

관련 정보