지정된 파일 크기보다 작은 파일 목록을 인쇄합니다.

지정된 파일 크기보다 작은 파일 목록을 인쇄합니다.

파일 목록을 검색하고 파일 크기 필드를 지정된 파일 크기와 비교한 다음 지정된 파일 크기보다 작은 파일을 표시하기 위해 실행할 수 있는 스크립트를 만들려고 합니다.

자세한 파일 목록을 얻으려면 "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 filesMAX bytesASSUMING

/bin/ls -l | awk -v MAX=150 '/^-/ && $5 <= MAX { print $NF }'

관련 정보