私の現在のコードは次のようなものです:
#!/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つの構文を取り、その構文に基づいてディレクトリを検索します。問題は、「ファイルの名前」+「ファイルのバイトサイズ」を出力したいのですが、それが機能しないようです。
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
正確な出力形式をあまり気にしない場合は、 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
何とか何とか何とか
または、ディレクトリを介して再帰する場合:
find
blah-type f -print | while IFS= read -r
blah blah
またはそれ以上:
find
blah-type f print0 | xargs -o
blah blah
ここで、-print0
とxargs -0
は、スペースまたはタブを含むファイル名を適切に処理します。