Bash 스크립트에서 현재 디렉토리에 디렉토리를 수평으로 입력하는 방법은 무엇입니까?

Bash 스크립트에서 현재 디렉토리에 디렉토리를 수평으로 입력하는 방법은 무엇입니까?

그래서 현재 코드는 다음과 같습니다: scan.h

#!/bin/bash
while IFS= read -r line;
do
    byte=$(stat -c%s "$line");
    echo "$line : $byte";
done< <(ls *.$1)

UNIX에서는 코드를 실행하면 다음과 같이 실행됩니다.

./scan.sh cpp
arraysum.cpp : 359
countLines.cpp : 1199
createtext.cpp : 240
multiproc1.cpp : 196
myWc.cpp : 1230
test.cpp : 193

이는 현재 디렉터리의 모든 .cpp 파일과 해당 바이트 수를 표시하기 때문에 예상되는 현상입니다. 그러나 카탈로그 폴더에서 다른 파일도 찾고 싶지만 측면에서 해당 파일에 접근하는 방법을 알 수 없는 것 같습니다.

참고 사항: 또한 단지 궁금해서, 바이트 크기를 기준으로 인쇄 명세서를 구성할 수 있습니까?

답변1

일반적으로 find디렉토리를 재귀적으로 검색합니다.

find . -name '*.cpp'

GNU가 있는 경우 find파일 이름과 크기를 바이트 단위로 직접 인쇄할 수 있으므로 호출을 피할 수 있습니다.stat

find . -name '*.cpp' -printf '%f:%s\n'

순서를 바꿔도 괜찮다면 명시적으로 정렬 가능한 방식으로 결과를 출력할 수 있습니다. 예를 들어 크기별로 높은 순으로 정렬됩니다.

find ../src -name '*.cpp' -printf '%s:%f\n' | sort -t: -rn

예를 들어 Awk를 사용하여 정렬 후 언제든지 필드를 바꿀 수 있습니다. 예를 들어 상위 5개 결과만 선택할 수도 있습니다.

find . -name '*.cpp' -printf '%s:%f\n' | sort -t: -rn | awk -F: 'NR==6 {exit} {print $2 " : " $1}'

마지막으로, "합법적인" 파일 이름을 안전하게 만들고 싶다면(줄 바꿈 포함) 모든 것을 null로 종료하십시오.

find . -name '*.cpp' -printf '%s:%f\0' | sort -t: -zrn | awk -vRS='\0' -F: 'NR==6 {exit} {print $2 " : " $1}'

관련 정보