모든 하위 디렉터리의 파일 수를 계산하고 그 수를 합산하는 방법

모든 하위 디렉터리의 파일 수를 계산하고 그 수를 합산하는 방법

각 디렉터리/하위 디렉터리의 파일 수를 세고 이를 함께 추가하여 총계를 구한 다음 다른 디렉터리와 비교할 수 있습니다.

#!/bin/bash

echo "Checking directories for proper extensions"

for LOOP in 1 2 3 4; 
do
    if [[ $LOOP -eq 1 ]]; then
        find ./content/documents -type f ! \( -name \*.txt -o -name \*.doc -o -name \*.docx \)
        count1=$(find ./content/documenets -type f) | wc -l
        #count number of files in directory and add to counter
    elif [[ $LOOP -eq 2 ]]; then
        find ./content/media -type f ! -name \*.gif 
        count2=$(find ./content/media -type f) | wc -l
        #count number of files in directory and add to counter
    elif [[ $LOOP -eq 3 ]]; then
        find ./content/pictures -type f ! \( -name \*.jpg -o -name \*.jpeg \) 
        count3=$(find ./content/pictures -type f) | wc -l
        #count number of files in directory and add to counter
    else
        count4=$(find /home/dlett/content/other -type f) | wc -l
        #count number of files in directory and add to counter
    fi

    #list the files in each subdirectory in catalog and put into an array
    #count the number of items in the array
    #compare number of item in each array
    #if the number of item in each array doesn't equal 
        #then print and error message
    content_Count=$(( count1+count2+count3+count4 ))
    echo $content_Count
done

답변1

귀하의 질문에는 이전에 알려진 양호한 값의 출처가 나와 있지 않습니다. 나는 당신이 content나무라는 이름의 나무와 평행한 나무를 가지고 있다고 가정합니다 ../oldcontent. 다음에 맞게 조정하십시오.

#!/bin/bash

echo "Checking directories for proper extensions"

for d in documents media pictures other
do
    nfc=$(find content/$d -type f | wc -l)
    ofc=$(find ../oldcontent/$d -type f | wc -l)
    if [ $nfc -eq $ofc ]
    then
         echo The "$d" directory has as many files as before.
    elif [ $nfc -lt $ofc ]
    then
         echo There are fewer files in the content directory than before.
    else
         echo There are more files in the content directory than before.
    fi
done

find이 코드는 각 루프에서 다른 명령을 내리 려고 시도하지 않기 때문에 훨씬 더 짧습니다 . 정말로 필요하다면 사용할 수 있습니다연관 배열매개변수 와 디렉터리 이름 쌍 find:

declare -A dirs=(
    [documents]="-name \*.txt -o -name \*.doc -o -name \*.docx" 
    [media]="-name \*.gif"
    [pictures]="-name \*.jpg -o -name \*.jpeg"
    [other]=""
)

그러면 for루프는 다음과 같습니다.

for d in "${!dirs[@]}"
do
    nfc=$(find content/$d -type f ${dirs[$d]} | wc -l)
    ofc=$(find ../oldcontent/$d -type f ${dirs[$d]} | wc -l)

...

그러나 이는 Bash 4 이상에서만 작동합니다. Bash 3에는 덜 강력한 연관 배열 메커니즘이 있었지만 설계상 거의 손상되었습니다. Bash 4가 없다면 이와 같은 작업에 Bash 3 연관 배열을 사용하는 대신 Perl, Python 또는 Ruby와 같은 것으로 전환하는 것이 좋습니다.

content이는 트리에 와 동일한 파일이 포함되어 있다는 것을 알려주는 것이 아니라 ../oldcontent각 하위 디렉터리에 동일한 수의 파일이 포함되어 있다는 것을 의미합니다. 각 트리에 있는 파일의 변경 사항을 감지하려면 다음을 사용해야 합니다.rsync아니면 내"MD5 디렉토리"Unix.SE의 솔루션.

관련 정보