for 루프를 사용하여 현재 디렉터리에 있는 각 파일의 줄 수를 계산하시겠습니까?

for 루프를 사용하여 현재 디렉터리에 있는 각 파일의 줄 수를 계산하시겠습니까?
  • 인수가 입력으로 제공되는 경우 스크립트는 해당 입력 파일의 줄 수만 확인해야 하며, 그렇지 않으면 스크립트는 해당 디렉터리에 있는 각 파일의 줄 수를 표시해야 합니다.
  • 스크립트 파일은 무시되어야 합니다. 즉, 스크립트 파일 개수가 표시되지 않아야 합니다.

나는 시도했다:

#!/bin/bash
if [ $# -eq 0 ]
then
        for l in *.txt
        do
                echo $(wc -l $l)
        done
else
        for l in $*
        do
                echo $(wc -l $l)
        done
fi

하지만 파일 형식(예: *.txt)을 명시적으로 언급하는 것은 허용되지 않습니다. 스크립트 파일을 제외한 모든 파일을 확인해야 합니다.

답변1

거의 이해하신 것 같아요. 당신은 basename "$0"그것을 사용할 수 있습니다스크립트에서 스크립트 이름 찾기를 제외한 모든 항목의 줄 수를 인쇄합니다.

#!/bin/bash
if [ $# -eq 0 ]
then
    for k in *
    do
        if [[ ! -d "$k" && "$k" != `basename "$0"` ]]
        then
            wc -l "$k"
        fi
    done
else
    for k in $*
    do
         wc -l "$k"
    done
fi

나는 자유를 취한다

  • k대신 사용하세요 l(변수 이름에는 권장되지 않습니다. 링크를 찾을 수는 없지만 확실합니다( , 1와 혼동 될 수 있음 I)).
  • 들여쓰기에는 공백 8개가 아닌 공백 4개를 사용합니다. 물론 최종 결정은 귀하의 몫이지만, 8개보다 4개의 공백이 더 읽기 쉽다고 말하고 싶습니다.
  • 변수를 참조하세요. 변수 이름을 공백으로 구분하지 않는 것이 좋습니다.
  • echo@Serg가 지적한 것처럼 불필요한 콘텐츠를 제거하십시오.

편집하다if조건 뿐만 아니라 이를 무시하기 위해 이중 괄호와 디렉토리 테스트를 추가했습니다 .

답변2

#!/bin/bash

if [[ "$#" != 0 ]]; then
  # only process the names given to us
  wc -l "$@"
  exit
fi

# process all regular files in this directory, avoiding this script
for f in ./*; do
    if [[ "$f" != "$0" ]] && [[ -f "$f" ]]; then
        wc -l "$f"
    fi
done

답변3

스크립트 외에도 3개의 명령을 한 줄에 결합하여 원하는 결과를 인쇄할 수 있습니다.
예를 들어.

find . -maxdepth 1 -type f -name "*.txt" -exec cat {} + | wc -l

현재 디렉터리에서만 검색하지 않고 라인 수를 재귀적으로 계산하려는 경우 "-maxlength 1" 스위치를 제거하거나 필요에 따라 숫자를 변경할 수 있습니다.

관련 정보