쉘 스크립트의 특정 디렉토리에 있는 파일 및 디렉토리 수

쉘 스크립트의 특정 디렉토리에 있는 파일 및 디렉토리 수

나는 Linux를 사용하고 있는데 그것은 나에게 새로운 것입니다. 쉘 스크립트를 만들었습니다 countfiledirs. 특정 디렉터리에 있는 파일과 디렉터리의 개수를 알고 싶습니다.

내 코드는 다음과 같습니다

#!/bin/bash
echo "total directories:" `find . -type d | wc -l`

echo "total files:" `find . -type f | wc -l`

이 명령을 실행하면 다음과 같이 표시됩니다../countfiledirs

total directories: 148
total files: 255 

이 명령을 사용하면 얼마나 많은 디렉터리와 파일이 있는지 알고 싶습니다 ./countfiledirs /usr/share.

답변1

wc -l파일과 디렉토리의 이름에는 개행 문자가 포함될 수 있으므로 지금처럼 "그냥" 사용할 수는 없습니다 .

인수를 받아들이고 파일 및 디렉터리 수를 반복적으로 계산하는 스크립트를 원하는 경우 다음을 사용해야 합니다.

#!/bin/bash
echo -n 'total directories:'; find "$1" -type d -printf \\n | wc -l
echo -n 'total files:';  find "$1" -type f -printf \\n | wc -l

그리고 디렉터리를 명령줄 인수로 제공하여 스크립트를 호출합니다.

./your_script_name /home/e_g_your_home_dir.

간단히 말해서 위의 내용은 디렉토리이지만(디렉토리 자체를 "디렉토리"로 간주하지 않는 한) wc -lNUL로 끝나는 "라인"을 처리하고 다음을 사용할 수 있는 것으로 대체할 수도 있습니다.-print0

#!/bin/bash
echo -n 'total directories:'; find "$1" -type d -print0 | python -c "import sys; print len(sys.stdin.read().split('\0'))-2"
echo -n 'total files:';  find "$1" -type f -print0 | python -c "import sys; print len(sys.stdin.read().split('\0'))-1"

이 작업을 반복적으로 수행하지 않으려면(지정한 디렉터리의 파일/디렉터리를 계산하지 않고 지정한 디렉터리의 파일/디렉터리만 계산) 인수 -maxdepth 1뒤에 를 추가 해야 합니다 $1.

답변2

명령줄에서 첫 번째 인수를 수락해야 합니다 $1. 이상적으로는 변수에 할당하는 것이 좋습니다 DIR="$1". 아무것도 제공되지 않으면 현재 디렉터리를 기본값으로 사용하려는 것 같습니다 .. or를 사용하여 이 작업을 수행 할 수 있으며 test -z "$DIR" && DIR='.', 보다 관용적인 방법은 변수를 사용하고 기본값을 제공하는 것입니다 "${DIR:-.}".

그것들을 합치면 다음과 같은 결과를 얻을 수 있습니다:

#!/bin/bash
DIR="$1"

echo "total directories: $(find "${DIR:-.}" -type d -ls | wc -l)"
echo "total files: $(find "${DIR:-.}" -type f -ls | wc -l)"

그런데 귀하가 게시한 원본 코드(질문을 편집하기 전)가 작동하지 않았습니다.

echo "total directories:" find . -type d | wc -l

find . -type d | wc -l백틱 안에 넣거나 `...`더 나은 방법으로는 생성자에 넣어야 합니다 $( ... ). 여기서는 두 번째 방법을 사용했습니다. 간단한 경우에는 동일할 수 있지만 $( ... )일반적으로 더 강력합니다.

관련 정보