디렉토리를 재귀적으로 검색할 때 스크립트가 작동하지 않습니다.

디렉토리를 재귀적으로 검색할 때 스크립트가 작동하지 않습니다.

그래서 현재 디렉터리에 있는 모든 파일과 하위 디렉터리에 있는 모든 파일의 크기를 재귀적으로 계산하는 스크립트를 만들고 있습니다.

#!bin/bash

Count () {
    size=0
    items=`ls "${1}/"`
    for item in $items
            do
            if [ ! -d $item ]
            then
                    cursize=`ls -l $item | awk '{ print $6 }'`
                    size=$[$size+$cursize]
            else
                    echo "$1/$item"
                    Count $1/$item
                    size=$[$size+$?]
            fi
    done
    echo "Done"
    return $size
}

Count ~

echo "$?"

그러나 스크립트를 실행하면 다음과 같은 결과가 나타납니다.

/home/161161/backup
Done
/home/161161/dir
ls: xoe1.txt: No such file or directory
script.sh: line 11: 28+: syntax error: operand expected (error token is "+")
1

xoe1.txt는 dir 디렉터리에 있는 파일입니다. 디렉터리에서 ls -l을 실행할 때 왜 이 문제가 발생하는지 모르겠습니다.

 ls -l dir
total 4
-rw-r--r-- 1 161161 domain users 23 Jun  2 22:55 test1.txt
-rw-r--r-- 1 161161 domain users  0 Jun  2 15:27 test2.txt
-rw-r--r-- 1 161161 domain users  0 Jun  2 15:27 test3.txt
-rw-r--r-- 1 161161 domain users  0 Jun  2 22:42 xoe1.txt <--
-rw-r--r-- 1 161161 domain users  0 Jun  2 22:42 xor1.txt
[161161@os ~]$

파일이 존재한다는 것을 보여줍니다.

어떤 아이디어가 있나요?

답변1

코드의 주요 문제(전체적으로 인용되지 않은 변수 확장을 사용하는 것 외에루프 출력lsls -l불필요하게) 실행하는 파일 이름 앞에 디렉터리 이름을 추가 하지 않는다는 것입니다 . 또한 크기 출력을 해당 크기의 디렉터리와 연결하는 데 어려움을 겪습니다.

return함수를 사용하여 크기를 반환 할 수도 있습니다 . 이 return명령문은 함수의 종료 상태를 반환하는 데 사용되어야 합니다(0은 성공을 나타내고, 0이 아닌 것은 실패를 나타내며 값은 256보다 작아야 함).

쉘 기능 구현:

#!/bin/bash

# Uses stat to get the total size in bytes of all files in the directory
# given on the function's command line. Assumes Linux "stat".
printdirsize () {
    local dir="$1"
    local sum=0

    shopt -s dotglob nullglob

    for filename in "$dir"/*; do
        [ ! -f "$filename" ] && continue  # skip non-regular files
        size=$( stat -c %s "$filename" )
        sum=$(( sum + size ))
    done

    printf 'Directory=%s\nSize=%d\n' "$dir" "$sum"
}

# Walks the directory tree from the given directory, calls printdirsize
# (above) and then descends into the subdirectories recursively.
dirwalker () {
    local dir="$1"

    printdirsize "$dir"

    shopt -s dotglob nullglob

    for filename in "$dir"/*; do
        [ ! -d "$filename" ] && continue  # skip non-directories
        dirwalker "$filename"
    done
}

# Start in the directory given on the command line, or use $HOME if
# nothing was given
dirwalker "${1:-$HOME}"

이것은 줄 것이다확실히모든 디렉터리의 크기입니다. du줄게실제디스크에 할당된 크기입니다. 차이점은 스파스 파일이 계산되는 방식입니다.

동일하지만 find함수를 생성하는 데 사용된 디렉터리 경로 이름을 사용 printdirsize합니다(여기에서 추출하여 에서 호출하는 인라인 스크립트로 사용됨 find).

#!/bin/sh

find "${1:-$HOME}" -type d -exec bash -O dotglob -O nullglob -c '
    for dir do
        sum=0
        for filename in "$dir"/*; do
            [ ! -f "$filename" ] && continue  # skip non-regular files
            size=$( stat -c %s "$filename" )
            sum=$(( sum + size ))
        done
        printf "Directory=%s\nSize=%d\n" "$dir" "$sum"
    done' bash {} +

재귀 함수의 유일한 차이점은 출력의 디렉터리 순서가 다를 수 있다는 것입니다.

답변2

du -sh *자신에게 맞지 않는 디렉토리에 있는 모든 파일의 크기를 원하는 경우 ?

관련 정보