파일 목록을 검색하고 파일 크기 필드를 지정된 파일 크기와 비교한 다음 지정된 파일 크기보다 작은 파일을 표시하기 위해 실행할 수 있는 스크립트를 만들려고 합니다.
자세한 파일 목록을 얻으려면 "ls -l"을 사용해야 한다는 것을 알고 있습니다. 그런데 목록을 검색하고 파일을 추출하려면 어떻게 해야 합니까?
답변1
접근 방식이 서툴러요(공평하게 말하면잘못된). find
그 중 하나는 이러한 작업을 위한 전문 도구가 있다는 것입니다.
예를 들어, 현재 디렉터리에서 1MiB(1048576바이트)보다 작은 모든 파일을 재귀적으로 찾으려면 다음을 수행하세요.
find . -type f -size -1048576c
또는 크기 기반 glob 한정자를 제공하는 셸을 zsh
재귀적으로 사용하세요.
print -rl -- **/*(.L-1048576)
여기에는 위의 내용과 달리 find
숨겨진 파일이 없습니다. D
이를 포함하려면 glob 한정자를 추가하세요 .
답변2
출력을 구문 분석할 때 기억해야 할 사항 ls -l
:
- 형식은 로케일에 따라 다릅니다. 형식은 POSIX/C 로캘의 POSIX에 의해서만 지정되며, 그런 경우에도 일부 변형(예: 필드 사이의 간격, 첫 번째 필드의 너비 등)이 허용됩니다. 예를 들어, 공백 문자로 시작하는 이식 가능한 파일 이름을 쉽게 감지할 수 없습니다.
- 많은 시스템에서는 사용자 및 그룹 이름에 공백을 허용하므로 출력을 안정적으로 구문 분석하는 것이 거의 불가능합니다.
ls -n
대신 (숫자 사용자 ID 사용)을 사용하는 것이 더 좋습니다ls -l
. ls
파일 이름에 개행 문자가 포함될 수 있는 경우(그리고 거의 모든 POSIX 시스템이 파일 이름에 개행 문자를 허용하는 경우) 해당 옵션을 사용하지 않으면 출력을 안정적으로 구문 분석하는 것이 불가능합니다-q
(그러나 정확한 파일 이름을 알 수는 없습니다. 참조된 표현만 보면 됩니다. 원래 파일 이름을 반환할 수 없음) 또는 일부 구현에서 발견되는 비표준 옵션을 사용합니다. 하지만 아래 팁도 참조하세요.- 이것크기모든 유형의 파일이 이 필드를 제공하는 것은 아닙니다(및 이 필드의 의미).크기일부 파일 유형의 경우 필드는 시스템마다 다릅니다. 일반 파일로 제한할 수도 있습니다.
- 위의 내용은 POSIX 를 가정합니다
ls
. 이전 버전은 출력 형식이 다르거나 경우에 따라 필드 사이에 공백이 누락된 것으로 알려져 있습니다.
따라서 이를 염두에 두고 파일 이름에 개행 문자가 포함되지 않고 공백 문자로 시작되지 않는다는 것을 보장할 수 있는 한 크기가 1MiB보다 엄격하게 작은 일반 파일을 나열하려면 다음을 수행할 수 있습니다.
(
export LC_ALL=C
ls -n | awk '
/^-/ && $5 < 1048576 {
gsub(/([^[:blank:]]+[[:blank:]]+){8}/, "")
print
}'
)
-a
숨겨진 파일을 포함하려면 이 옵션을 추가하세요. -L
심볼릭 링크가 (결국) 해결되는 파일을 고려하려는 경우 추가하십시오 .
다른 사람들이 말했듯이 올바른 해결책은 find
여기에서 사용하는 것입니다.
줄 바꿈을 방지하고 공백 문제를 일으키는 팁입니다.
ls -n
대신 을 사용하면 파일 이름이 시작되는 위치(맨 위 )와 파일 이름이 끝나는 줄(다음 줄 앞의 줄 ) ls -nd ./*
을 알 수 있으므로 다음과 같이 할 수 있습니다../
./
(
export LC_ALL=C
ls -nd ./* | awk '
/\// {
selected = (/^-/ && $5 < 1048576)
sub(/.*\//, "./")
}
selected'
)
그러나 ./*
현재 디렉터리에 많은 수의 파일이 있는 경우(셸이 확장된 경우) 이 방법은 작동하지 않으며 이로 인해 인수 수 제한에 도달할 수 있습니다.
여기서는 도움이 되지 않는 숨겨진 파일을 포함하려면 -a
쉘에 해당 파일을 확장하라고 지시해야 합니다. POSIXly는 약간 투박합니다.
ls -dn ./..?* ./.[!.]* ./*
(이로 인해 누락된 파일에 대한 경고 메시지가 나타날 수 있습니다 ./..?*
. )./.[!.]*
답변3
출력 만 구문 분석하여 상한( ) 보다 작고 파일 이름에 공백/줄 바꿈이 없는 파일을 ls's
찾을 수 있으므로 다음을 수행할 수 있습니다.regular files
MAX bytes
ASSUMING
/bin/ls -l | awk -v MAX=150 '/^-/ && $5 <= MAX { print $NF }'