모든 파일 형식 찾기를 사용하여 file -b $(find . -type f)
고유한 카테고리로 분류한 다음 동일한 수의 "#"으로 대체된 숫자로 처음 4개 카테고리를 인쇄해야 합니다. 출력은 다음과 같아야 합니다.
8 empty : ########
6 ASCII text : ######
3 Vim swap file, version 7.4 : ###
1 UTF-8 Unicode text : #
각 카테고리의 파일 수를 "#" 표시로 인쇄하는 방법을 모르겠습니다.
각 줄의 숫자를 값으로 갖고 끝에 같은 수의 "#" 표시를 넣고 싶습니다.
답변1
"N 문자 시퀀스로 숫자 N을 표현하는 방법"이라는 주요 질문에 대답하기 위해 다음을 수행하는 쉘 명령이 있습니다.
n=17 # Number to translate to a sequence
printf "%${n}s" '' | tr ' ' '#'
(대체 구문: printf '%*s' "$n" '' | tr ' ' '#'
; 다른 대안이 있으면 요점을 알 수 있습니다)
이것이 하는 일은 n
공백( printf
부분)으로 구성된 빈 줄을 생성한 다음 각 공백을 원하는 문자( tr
부분)로 변환하는 것입니다.
count_files
질문에 포함된 목록을 출력하는 명령이 있다고 가정하면 다음과 같이 명령을 사용할 수 있습니다.
count_files \
| while read n type; do
printf '%4d %-30s %s\n' "$n" "$type" "$(printf "%${n}s" '' | tr ' ' '#')"
done
...그리고 다음과 같은 결과를 얻게 됩니다:
8 empty ########
6 ASCII text ######
3 Vim swap file, version 7.4 ###
1 UTF-8 Unicode text #
답변2
Perl에서는 연산자를 사용하여 문자를 여러 번 반복할 수 있습니다 x
.
$ perl -e 'print "#" x 10, "\n"'
##########
그것을 사용하자.
대신에출력 구문 분석find
:
find . -type f -exec file -b {} + | sort | uniq -c | sort -rn |
perl -ne 'chomp; s/\s+(\d+)\s+// && printf("%-3d %-50s: %s\n", $1, $_, "#" x $1)'
Perl 스크립트까지의 첫 번째 부분은 다음과 같은 출력을 생성합니다.
23 ASCII C program text
12 ASCII text
10 ELF 64-bit LSB relocatable, x86-64, version 1
3 ASCII English text
1 ELF 64-bit LSB shared object, x86-64, version 1
Perl 스크립트는 후행 개행 문자를 제거한 chomp
다음 숫자를 $1
. 그런 다음 printf()
숫자, 파일 유형 및 #
숫자가 나타내는 문자 수를 인쇄합니다.
최종 출력은 다음과 유사합니다.
23 ASCII C program text : #######################
12 ASCII text : ############
10 ELF 64-bit LSB relocatable, x86-64, version 1 : ##########
3 ASCII English text : ###
1 ELF 64-bit LSB shared object, x86-64, version 1 : #