현재 디렉토리의 파일이 8줄을 초과할 때마다 증가하는 쉘 스크립트에 카운터를 만드시겠습니까? [폐쇄]

현재 디렉토리의 파일이 8줄을 초과할 때마다 증가하는 쉘 스크립트에 카운터를 만드시겠습니까? [폐쇄]

현재 디렉토리의 파일이 8줄을 초과할 때마다 증가되는 쉘 스크립트에서 카운터를 생성하는 방법과 두 개의 목록(하나는 8줄을 초과하는 파일을 포함하고 다른 하나는 8줄을 초과하는 파일을 포함)을 생성하는 방법 라인. 8줄 미만의 다른 파일이 있나요? 나는 이것을 시도했지만 그것이 틀렸다고 확신합니다.

contor=0 
while [ contor -le 100 ] 
do 
      echo $contor 
      contor=expr $contor + 1 
done

답변1

#!/bin/bash

shopt -s nullglob dotglob

long_files=()
short_files=()

for name in ./*; do
        [[ ! -f $name ]] && continue

        numlines=$( wc -l <"$name" )

        if [[ numlines -gt 8 ]]; then
                long_files+=( "$name" )
        elif [[ numlines -lt 8 ]]; then
                short_files+=( "$name" )
        fi
done

printf 'There are %d files with more than 8 lines:\n' "${#long_files[@]}"
printf '\t%s\n' "${long_files[@]}"

printf 'There are %d files with less than 8 lines:\n' "${#short_files[@]}"
printf '\t%s\n' "${short_files[@]}"

이것은 실제로 파일에 8줄보다 많거나 적은지 여부에 따라 현재 디렉터리의 모든 이름을 반복하고 이름을 두 개의 목록(배열) long_files과 으로 분할하여 요청한 작업을 수행합니다 . short_files정확히 8줄의 파일은 목록에 저장되지 않습니다. -f테스트 및 명령문은 비전통적인 파일(예: 디렉터리 등)에 해당하는 이름을 건너뜁니다 continue.

줄 수는 를 사용하여 계산되므로 wc -l파일의 개별 줄을 계산하기 위해 카운터를 사용할 필요가 없습니다.

이 스크립트 설정 nullglobdotglob셸 옵션을 사용하면 완전히 비어 있는 디렉터리와 숨겨진 파일을 올바르게 처리할 수 있습니다.

마지막으로 두 개의 목록이 출력됩니다.

테스트 실행:

$ bash script.sh
There are 1 files with more than 8 lines:
        ./script.sh
There are 3 files with less than 8 lines:
        ./.bash_profile
        ./.bashrc
        ./.zshrc

목록이 포함된 두 개의 파일을 만들려면 위 스크립트의 끝 부분에 있는 파일에 목록을 인쇄하세요.

printf '%s\n' "${long_files[@]}"  >long_files.list
printf '%s\n' "${short_files[@]}" >short_files.list

또는 배열에 이름을 추가하는 대신 프로그램의 메인 루프에서 파일로 인쇄합니다.

#!/bin/bash

shopt -s nullglob dotglob

rm -f long_files.list short_files.list

for name in ./*; do
        [[ ! -f $name ]] && continue

        numlines=$( wc -l <"$name" )

        if [[ numlines -gt 8 ]]; then
                printf '%s\n' "$name" >>long_files.list
        elif [[ numlines -lt 8 ]]; then
                printf '%s\n' "$name" >>short_files.list
        fi
done

도착하다계산8줄보다 긴 파일 수, 긴 파일이 감지될 때 증가하는 카운터 변수를 사용하거나, 길고 짧은 파일의 배열을 사용하는 경우 "${#long_files[@]}"루프 뒤의 긴 파일 수를 가져옵니다(첫 번째 코드 조각에서처럼). ).

관련 정보