rm은 파일을 매우 느리게 삭제합니다.

rm은 파일을 매우 느리게 삭제합니다.

특정 범위의 숫자가 지정된 파일을 삭제하기 위해 Bash에서 다음 스크립트를 작성했습니다.

# *** Declare variables ***
SRC="${1}"
START="${2}"
END="${3}"

# *** Delete frame range ***
for frame in $(seq -f "%08g" "${START}" "${END}")
    do
        rm -vf "${SRC}${frame}"*
    done

테스트에서는 잘 작동했지만 라이브 서버에서 실행하면 달팽이 속도로 파일이 삭제됩니다. rm이 그렇게 느리게 실행되는 이유가 있나요?

감사해요!

답변1

각:

rm -vf "${SRC}${frame}"*

쉘은 먼저 glob을 확장하여 에 전달될 인수 목록을 구성해야 합니다 rm. 이를 위해 디렉터리의 내용을 읽고 각 파일 이름을 패턴과 일치시킵니다.

예를 들어 $SRCis foo/bar및 is 00000000인 경우 디렉터리의 전체 내용을 $frame읽고 모든 항목을 패턴과 일치시켜야 합니다. 파일이 많으면 시간이 오래 걸릴 수 있습니다.foobar00000000*

rm, 그러면 디렉터리에서 이러한 파일을 찾아야 하며, 디렉터리가 크고 색인화되지 않은 경우 시간이 걸릴 수 있습니다. 그러면 파일을 삭제한다는 것은 디렉터리를 수정하고 해당 인덱스(있는 경우)를 업데이트하는 것을 의미하며, 큰 디렉터리의 경우 비용이 많이 들 수 있습니다.

쉘이 프레임마다 전체 디렉토리를 읽어야 하는 것을 피하기 위해 최소한 하나의 glob만 확장해야 합니다.

십진 정수 범위를 zsh갖는 전역 연산자는 무엇입니까 ?<first-last>

#! /bin/zsh -
src=$1 start=$2 end=$3

[[ $# -eq 3 && $start = <-> && $end = <-> && $end -ge $start ]] || {
  print -ru2 "Usage: $ZSH_SCRIPT:t <src> <start> <end>"
  exit 1
}
set -o extendedglob

range="(<$start-$end>~^?(#c8))" # range expressed on 8 characters
rm -vf -- $src$~range*

명령에 전달할 수 있는 인수 수에 대한 시스템 제한이 발생하는 경우 마지막 줄을 다음과 같이 변경할 수 있습니다.

print -rN -- $src$~range* | xargs -r0 rm -vf --

관련 정보