Bash 스크립트에서 각 파일의 바이트 크기를 어떻게 인쇄합니까? [폐쇄]

Bash 스크립트에서 각 파일의 바이트 크기를 어떻게 인쇄합니까? [폐쇄]

내 현재 코드는 다음과 같습니다.

스캔.sh:

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

출력은 다음과 같습니다:

./scan.sh cpp
./scan.sh: line 4: byte: command not found
arraysum.cpp :
./scan.sh: line 4: byte: command not found
countLines.cpp :
./scan.sh: line 4: byte: command not found
createtext.cpp :
./scan.sh: line 4: byte: command not found
multiproc1.cpp :
./scan.sh: line 4: byte: command not found
myWc.cpp :
./scan.sh: line 4: byte: command not found
test.cpp :

기본적으로 내 코드는 구문을 사용하고 해당 구문을 기반으로 디렉터리를 검색합니다. 문제는 "파일 이름" + "파일 바이트 크기"를 인쇄하고 싶은데 제대로 작동하지 않는 것 같습니다.

답변1

Bourne의 쉘과 유사한 구문에서는 bash기호 할당 주위에 공백이 있을 수 없습니다 =.

byte=value

하지만 여기서 구문 분석된 출력 ls은 나쁜 생각입니다.

다음과 같이 작성할 수 있습니다.

#! /bin/sh -
stat -c '%n: %s' -- *."$1"

루프가 정말로 필요한 경우 다음과 같이 작성하십시오.

#! /bin/zsh -
for file in *.$1; do
  stat -c '%n: %s' -- $file
done

또는 다음을 사용해야 하는 경우 bash:

#! /bin/bash -
shopt -s failglob
for file in *."$1"; do
  stat -c '%n: %s' -- "$file"
done

답변2

이는 이를 수행하는 간단한 방법이며 다음과 함께 사용해야 합니다.본 쉘정확한 출력 형식에 크게 신경 쓰지 않는 경우 해당 하위 항목(bash 및 ksh 포함)은 다음과 같습니다.

$ for file in *; do if [ -f "$file" ] && [ -r "$file" ]; then wc -c "$file"; fi; done
      23 HEAD
     111 config
      73 description

버그나 특수한 경우에도 크게 신경 쓰지 않는다면(이런 경우에는 행운을 빕니다):

$ for file in *; do wc -c $file; done

노트:

  • bash 또는 ksh를 사용하여 이 코드를 작성하는 경우 대신 (( ))or 를 사용하는 것이 좋습니다 . ([[ ]][ ]원천) 또한 아래 ) $(wc -c <"$file")대신 )을 사용하는 것도 고려해 보세요 `wc -c <"$file"`. (원천)

  • -f보고 있는 것이 일반 파일인지 테스트하십시오(디렉토리, 장치, 파이프, 소켓, tty 또는 일반적으로 바이트 단위의 크기를 가지고 있다고 말할 수 없는 이상한 파일이 아님). -r파일을 읽을 수 있는지 테스트하십시오. 즉, wc성공할 가능성이 높습니다. 대용량 파일이나 읽을 수 없는 파일을 보고 있다면 stat원본 버전과 Stéphane의 답변을 따르십시오.

  • "$file"파일에 공백이나 탭이 포함된 경우(예: 이름이 지정된 파일) 따옴표( )를 사용해야 합니다 my stuff.txt.

  • 정확한 형식에 관심이 있다면 `wc -c <"$file"`(파일 이름을 인쇄하지 않음) 및 echo또는 echo -n(원하는 대로 인쇄함)을 조합하여 사용해야 할 것입니다.

  • 관심 있는 파일이 스크립트에 대한 인수인 경우 "$@"(설명하다).

ls나는 ;의 출력을 구문 분석해서는 안된다는 @stéphane-chazelas의 의견에 동의합니다. 하지만 그렇게 한다면 그럴 필요는 없다.프로세스 교체. 명령의 출력을 더 간단하게 읽을 수 있습니다.

ls | while IFS= read -r 잠깐 잠깐 잠깐 잠깐

또는 디렉토리를 재귀적으로 사용하려는 경우:

find 무의미한 말 -type f -print | while IFS= read -r 바라바라

아니면 더 나은 방법은 다음과 같습니다.

find 무의미한 말 -type f print0 | xargs -o 바라바라

공백이나 탭이 있는 파일 이름을 다시 -print0올바르게 처리합니다.xargs -0

관련 정보