다음과 같이 하면 크기가 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 -lh
find는 발견된 각 파일에 대해 명령을 실행합니다 {}
. ' \;
'는 각 파일에 개별적으로 명령을 제공한다는 의미입니다. 매뉴얼 페이지에서:
-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로 줄였습니다.