web-dev-qa-db-ja.com

Bashスクリプトの各ファイルのバイトサイズを印刷するにはどうすればよいですか?

私の現在のコードは次のようなものです:

scan.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つの構文を取り、その構文に基づいてディレクトリを検索します。問題は、「ファイルの名前」+「ファイルのバイトサイズ」を出力したいのですが、それが機能しないようです。

2
Li Wang

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
7

正確な出力形式をあまり気にしない場合は、 Bourne Shell とその子孫(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で記述している場合は、(())の代わりに[[]]または[]を使用する方がよいでしょう。 ( source )また、以下では、`wc -c <"$file"`の代わりに$(wc -c <"$file")を使用することを検討してください)。 ( ソース

  • -fは、見ているものが通常のファイル(ディレクトリ、デバイス、パイプ、ソケット、tty、または一般にバイト単位のサイズとは言えない奇妙なものではない)であるかどうかをテストします。 -rは、ファイルが読み取り可能であること、つまりwcが成功する可能性があることをテストします。巨大なファイルや読み取れないファイルを探している場合は、元のバージョンとステファンの回答に従ってstatを使用してください。

  • 引用符("$file")は、ファイルのいずれかにスペースまたはタブが含まれている場合に必要です(たとえば、my stuff.txtという名前のファイル)。

  • 正確な形式を気にする場合は、`wc -c <"$file"`(ファイル名を出力しません)とechoまたはecho -n(好きなものを出力します)の組み合わせを使用する必要があります。

  • 対象のファイルがスクリプトへの引数である場合、そのスクリプトでは"$@"説明 )を使用します。

lsの出力を解析してはならないという@stéphane-chazelasに同意します。ただし、そうする場合は、 プロセス置換 は必要ありません。コマンドの出力をより簡単に読み取ることができます。

ls | while IFS= read -r何とか何とか何とか

または、ディレクトリを介して再帰する場合:

findblah-type f -print | while IFS= read -rblah blah

またはそれ以上:

findblah-type f print0 | xargs -oblah blah

ここで、-print0xargs -0は、スペースまたはタブを含むファイル名を適切に処理します。

0
user10543