방금 스크립팅 과정을 시작했는데 도움이 필요합니다. 나는 주어진 디렉터리에 있는 모든 파일과 디렉터리의 파일 이름을 확인하고 모든 파일, 하위 디렉터리, 심볼릭 링크, 이전 파일, 그래픽 파일, tmp 파일, exe 파일 및 각 파일의 개수를 누적하는 스크립트를 작성 중입니다. 이 디렉토리의 바이트 수입니다.
출력 형식은 다음과 같이 지정되어야 합니다.
- 디렉토리 n, nnn, nnn
- 파일 n, nnn, nnn
- 등...
스크립트를 실행하면 모든 카운트 항목이 0을 반환하므로 아무것도 계산되지 않는 것 같습니다. 또한 숫자를 쉼표로 형식화하는 데 문제가 있습니다. $1은 스크립트를 실행할 때 사용자가 입력할 검색 디렉터리입니다(예: ./srpt /etc). 검색을 실행하기 위해 find 명령과 printf를 사용하여 출력 형식을 지정하고 출력을 wc로 파이프하여 줄 수를 계산했습니다. 나는 이것이 파일 이름에 단 한 줄만 부여하는 파일 수를 줄 것이라고 생각했습니다. 이를 수행하는 방법은 아마도 수십억 가지가 있을 것이며 이 방법이 가장 우아하지는 않을 수도 있지만 누구라도 의견을 제시해 주시면 감사하겠습니다.
if [ -d "$1" ]; then
directories=$(find "$1" -type d -printf "%'d" | wc -l)
files=$(find "$1" -type f -printf "%'d" | wc -l)
sym=$(find "$1" -type l -printf "%'d" | wc -l)
등...
#Printing the output to the terminal
echo "Directories" $directories
echo "Files" $files
echo "Sym links" $sym
exit 0
else
echo "[ERROR]: need path to perform search"
exit 1
fi
내 결과:
Directories 0
Files 0
Sym Links 0
답변1
명령을 다음 형식으로 변경해야 합니다.
directories=$(printf "%'d\n" $(find "$1" -type f | wc -l))
printf
현재 로캘의 천 단위 구분 기호를 사용하세요. 구분 기호는 쉼표, 점 또는 아무것도 아닐 수 있습니다. 쉼표를 강제로 적용하려면 로케일을 변경할 수 있습니다.
또는 다음과 같은 방법으로 수행할 수 있습니다.
if [ -d "$1" ]; then
directories=$(find "$1" -type d | wc -l)
files=$(find "$1" -type f | wc -l)
sym=$(find "$1" -type l | wc -l)
그리고 echo
로 교체printf
#Printing the output to the terminal
printf "%s %'d\n" "Directories" $directories
printf "%s %'d\n" "Files" $files
printf "%s %'d\n" "Sym links" $sym
printf
이 오류는 두 가지 다른 명령(bash 및 find ) 을 혼동했기 때문에 발생합니다 -printf
.
조회 -printf
형식이 "%'d"
잘못되었습니다. %d
디렉터리 트리의 파일 깊이를 나타내는 작은따옴표는 허용되지 않습니다 . 다음을 입력하여 -printf
모든 옵션을 찾을 수 있습니다 .man find
/printf format
그런데, 두 가지 모두 (bash와 find) \n
에 추가해야 합니다 . 그렇지 않으면 모든 출력을 한 줄에 인쇄합니다.printf
"%d\n"
답변2
-printf "%'d"
여기서는 아무 작업도 수행되지 않으므로 개수 결과가 0이 되며 이를 변경하는 데 사용해야 합니다 -printf "%p\n"
.