![Bash 스크립트에서 각 파일의 바이트 크기를 어떻게 인쇄합니까? [폐쇄]](https://linux55.com/image/140191/Bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%EA%B0%81%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EB%B0%94%EC%9D%B4%ED%8A%B8%20%ED%81%AC%EA%B8%B0%EB%A5%BC%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%9D%B8%EC%87%84%ED%95%A9%EB%8B%88%EA%B9%8C%3F%20%5B%ED%8F%90%EC%87%84%5D.png)
내 현재 코드는 다음과 같습니다.
스캔.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