각 디렉터리/하위 디렉터리의 파일 수를 세고 이를 함께 추가하여 총계를 구한 다음 다른 디렉터리와 비교할 수 있습니다.
#!/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의 솔루션.