백업 프로그램의 일관성 검사를 위해 하위 디렉터리, 하위 하위 디렉터리 등의 모든 파일을 포함하여 디렉터리의 모든 파일을 계산하는 기능을 정의하고 싶습니다.
지금까지 시도한 솔루션은 다음과 같습니다.
countfiles() {
local cdir=$1
local files=$(ls -la $cdir | grep -cv '^[dl]')
local dirstring=$(ls -la $cdir | grep '^d' | egrep -o ' \.?[^[:space:].][^[:space:]]+$')
local directories=(${dirstring//"\n"/})
echo ${directories[@]}
for dir in ${directories[@]}; do
echo -n "$dir "
echo -n 'filecount >> '
local dirfiles=$(countfiles "$cdir/$dir")
echo -n $dirfiles
echo ' <<'
#files=$(($files+$dirfiles))
done
echo $files
}
그러면 다음과 같은 결과가 나옵니다.
.config .i3 .scripts
.config filecount >> gtk-3.0 termite gtk-3.0 filecount >> 2 << termite filecount >> 2 << 1 <<
.i3 filecount >> 5 <<
.scripts filecount >> 2 <<
5
내 카운터의 구현에는 $files
atm이라는 주석이 달려 있어 지역화를 해제해야 할 수도 있지만 지금은 간섭을 피하기 위해 모든 변수를 로컬로 만듭니다.
디렉토리 트리는 다음과 같습니다.
/.scripts/backup_dotfiles.sh
/.config/termite/config
/.config/gtk-3.0/settings.ini
/.i3/config
/.i3/i3blocks.conf
/.i3/lockicon.png
/.i3/lockscreen.sh
/.gtkrc-2.0
/.bashrc
/.zshrc
/.i3
/.Xresources
내 질문:
- 홈 디렉터리 외부의 파일은 왜 항상 +1인가요?
- ".config" 디렉터리에 파일이 없는데 왜 그 디렉터리에 있는 내용을 계산합니까?
- 이 문제를 어떻게 해결할 수 있나요?
답변1
find
파일 이름에 개행 문자가 없다고 가정하면 다음을 수행하십시오 .
find "$dir" -type f | wc -l
-type f
일반 파일과 일치하지만 디렉터리, 파이프, 소켓 등과는 일치하지 않습니다.
일반적인 출력에서는 find
파일 이름을 개행 문자로 구분하므로 이름에 개행 문자가 포함되어 있으면 출력이 모호해집니다. GNU find를 사용하면 다음과 같이 작동합니다.
find "$dir" -type f -printf . | wc -c
파일당 하나의 포인트만 인쇄 find
하고 포인트 수를 계산합니다.
다른 버전에서는 find
그렇지 않지만 -printf
이중 슬래시를 사용하여 입력 경로를 전달하는 트릭을 사용할 수 있습니다. 단일 슬래시로 처리되지만 파일 이름에는 슬래시가 포함될 수 없으므로 출력에 자연스럽게 표시되지 않습니다. 그런 다음 출력에서 이중 슬래시 수를 계산합니다.
find "$dir//" -type -f | grep -c //
순전히 쉘 스크립트를 사용하여 이 작업을 수행하려면 쉘에 파일 이름을 나열하도록 요청할 수 있습니다.사용할 필요가 없습니다ls
, 예를 들어 Bash에서는 다음과 같습니다.
#!/bin/bash
files=0
shopt -s dotglob
countfiles() {
local f;
for f in * ; do
if [ -f "$f" ] ; then # count regular files
files=$((files + 1))
elif [ -d "$f" ] ; then # recurse into directories
cd "$f"
countfiles
cd ..
fi
done
}
cd "$1"
countfiles
echo $files
답변2
다음 명령을 사용하여 디렉터리 및 하위 디렉터리의 파일 수를 얻을 수 있습니다.
find path_to_directory -type f | wc -l
답변3
홈 디렉터리 외부의 파일은 왜 항상 +1인가요?
ls -la도 total 20
출력에 문자열을 추가하기 때문입니다. "마스터" 디렉터리에 대해서도 +1 값이 표시되는 것을 볼 수 있습니다.
".config" 디렉터리에 파일이 없는데 왜 그 디렉터리에 있는 내용을 계산합니까?
같은 이유. total ..
결과 문자열 ls
.
이 문제를 어떻게 해결할 수 있나요?
스크립트를 사용하지 마세요 :) 내 말은, 정말 너무 복잡하다는 뜻입니다. 우리는 find
여기서 즐거운 시간을 보냅니다. 모든 스크립트는 다음과 같습니다(디렉토리당 파일이 필요한 경우).
find $yourdir -type d | while read dir ; do
echo "$dir == $(find $dir -maxdepth 1 -type f | wc -l) files" ;
done
아니면 그냥 (합계 값이 필요한 경우):
find $yourdir -type f | wc -l