쉘 스크립트를 만들고 싶습니다 df
. 왜냐하면 df name_of_file
파일 내용을 입력하고 가져오고 싶기 때문입니다 .
파일 이름이 디렉토리에 있으면 그 내용을 표시하고 싶습니다. 그렇지 않은 경우 크기를 단어, 줄, 바이트 단위로 표시하고 싶습니다. 나는 무엇을 해야 합니까? 지금까지 나는 이것을 가지고 있습니다 :
#!/bin/bash
FILENAME=$FILENAME
FILEBYTES=$(stat -c%s "$FILENAME")
FILEWORDS=$(stat -w%s "$FILENAME")
FILELINES=$(stat -l%s "$FILENAME")
echo "Size of $FILENAME in bytes = $FILEBYTES bytes, $FILEWORDS words, $FILELINES lines."
답변1
나는 이렇게 할 것이다:
#!/bin/bash
FILENAME=$1
[ -f "$FILENAME" ] || exit
FILEBYTES=$(stat -c%s "$FILENAME")
FILEWORDS=$(wc -w "$FILENAME" | awk '{print $1}')
FILELINES=$(wc -l "$FILENAME" | awk '{print $1}')
printf "Size of %s -- %s bytes, %s words, %s lines.\n" \
"$FILENAME" "$FILEBYTES" "$FILEWORDS" "$FILELINES"
예
다음 파일이 있다고 가정해 보겠습니다.
$ ls -l | grep bbbb
-rw-rw-r-- 1 saml saml 3283 May 18 02:49 bbbb
이제 이라는 스크립트를 실행합니다 df.bash
. 이 df
명령은 Unix에서 사용되었습니다.
$ ./df.bash bbbb
Size of bbbb -- 3283 bytes, 386 words, 94 lines.
존재하지 않는 파일 찾기:
$ ./df.bash bbbbbbb
$
대체 방법
awk
카운팅 대신 병합 및 카운트를 수행하면 낭비되는 통화를 줄일 수 있습니다 wc
.
#!/bin/bash
FILENAME=$1
[ -f "$FILENAME" ] || exit
FILEBYTES=$(stat -c%s "$FILENAME")
FILEWORDS=$(awk '{ total = total + NF }; END {print total}' "$FILENAME")
FILELINES=$(awk 'END {print NR}' "$FILENAME")
printf "Size of %s -- %s bytes, %s words, %s lines.\n" \
"$FILENAME" "$FILEBYTES" "$FILEWORDS" "$FILELINES"
답변2
넌 이걸 원해?
#! /bin/bash
if [[ -f $(basename "$1") ]]
then
cat "$1"
else
wc -w -l -c "$1"
fi
그런데 df
이미 디스크 공간 사용량을 표시하는 명령이 있습니다. 스크립트를 다른 이름으로 부르는 것이 좋습니다.