"찾기"를 사용하지 않고 파일 크기 하한 및 상한 표시

"찾기"를 사용하지 않고 파일 크기 하한 및 상한 표시

vimLinux에서 이라는 스크립트를 작성 해야 합니다 between. 이 스크립트는 파일 크기의 하한 및 상한으로 두 개의 매개변수를 사용하여 파일 이름 및 크기 목록을 인쇄합니다. 그러나 이 find명령을 사용하여 이 스크립트를 완료 할 수 없습니다 .

나는 이것을 했습니다: 모든 파일을 표시하지만 그렇지 않은 특정 파일은 표시할 수 없는 것 같습니다 find.

#!/bin/bash

for i in *
do
    set -- $(ls -l "$i")
    echo $i: $5 bytes
done

답변1

당신은 할 수 있습니다:

  • 범위를 확인하려면 다음 if명령문이나 continue연산을 사용할 수 있습니다.

    if [[ $z -ge $1 || $z -le $2 ]]
    then
        : print result
    fi
    

    또는

    [[ $z -lt $1 || $z -gt $2 ]] && continue
    : print result
    
  • 필요에 따라 테스트 옵션은 다음과 같습니다.

    • -ge: 이상
    • -le: 이하
    • -lt: 미만
    • -gt: 보다 낫다
  • 크기를 확인하려면 stat, du또는 를 사용하세요 . ls후자의 두 가지 경우에는 대상이 디렉터리인지 일반 파일인지 확인해야 합니다.

    if [[ -f "$f" ]]
    then
        : a regular file
    fi
    

    또는 중첩된 if를 방지하려면 다음을 수행하세요.

    ! [[ -f "$f" ]] && continue
    

    예를 들어 파일 크기는 다음과 같습니다.

    z=$(stat -c%s "$f")
    z=$(du -b "$f" | cut -f1)
    z=$(ls -l "$f" | cut -d' ' -f5)
    
  • 결과를 인쇄하려면 이 기능을 사용하여 printf더 깔끔한 인쇄물을 얻을 수 있습니다. 즉, 고정된 크기 등또한 이것을 읽으십시오.

  • 정말로 친절해지고 싶다면 주장도 검증해 보세요...


#!/bin/bash

usage()
{
    printf "Usage: %s <min-size> <max-size>\n" "$0" >&2
    exit 1
}

! [[ "$1" =~ ^[0-9]+$ ]] && usage
! [[ "$2" =~ ^[0-9]+$ ]] && usage


for f in *
do
    z=$(stat -c%s "$f")

    # Alternatives to get size:
    # ! [[ -f "$f" ]] && continue
    # z=$(du -b "$f" | cut -f1)
    # z=$(ls -l "$f" | cut -d' ' -f5)

    if [[ $z -ge $1 || $z -le $2 ]]
    then
        printf "%11d %s\n" "$z" "$f"
    fi
done

답변2

for i in *
do
  size=$(stat --format="%s" "$i")
  if [ $size -gt $1 -a $size -lt $2 ]
  then
    printf "Right-sized: %s\n" "$i"
  else
    printf "Wrong-sized: %s\n" "$i"
  fi
done

이는 루프에 대한 업데이트일 뿐이지만 ls를 구문 분석하는 대신 stat를 사용하여 파일 크기를 바이트 단위로 수집합니다.

이 코드 조각에서는 $1과 $2에 대한 온전성 검사가 이미 수행되었다고 가정합니다. 저는 이를 수행하고 싶지 않습니다.모두당신을 위한 숙제!

답변3

필요한 것은 셸에서 다음 구문을 사용하는 조건부입니다.

if TEST
then
    ACTION
else
    ACTION
fi

테스트를 위해 일반적으로 사용됩니다 [. 예를 들어 25보다 크고 50보다 작은지 확인하려면 $5다음과 같이 작성합니다.

if [ "$5" -gt 25 ] && [ "$5" -lt 50 ]
then
    echo "It's greater than 25 but is less than 50"
else
    echo "It's either <= 25, or >= 50, or not a number at all"
fi

따옴표를 잊지 마세요(알림을 주신 @Wildcard에게 감사드립니다).통과하지 마세요 [4개 이상의 매개변수(링크를 제공한 @Jeff Schaller에게 감사드립니다.)

확인하다Bash 초보자 가이드그리고고급 Bash 스크립팅 가이드, 그들은 좋은 참고 자료입니다.

(그러나 Bash 외에 다른 셸도 있으므로 구문과 기능이 다를 수 있습니다.)

관련 정보