
ユーザーフォルダ内のすべてのユーザーを繰り返し、各ホームディレクトリにあるファイル数を印刷しようとしています。 Usersディレクトリにいるときに実験する
ls ./<someusername> | wc -l
このコマンドは私が欲しいものを印刷します。 forループで使用すると...
for f in ./*; do ls ./* | wc -l $f; done
それは私に与えた
wc: ./user1: read: Is a directory
wc: ./user2: read: Is a directory
wc: ./user3: read: Is a directory
wc: ./user4: read: Is a directory
ユーザーの番号やフォルダではなく、誰でも私を助けることができれば幸いです。私はしばらくこの問題を解決してきました。
答え1
for f in ./*; do ls ./* | wc -l $f; done
f
これにより、現在のディレクトリ()のすべてのファイル名が設定されます。./*
各ファイルに対して、現在のディレクトリのすべてのファイル名を使用して再実行され、出力ls
をwc -l $f
。wc -l
したがって、ここでパイプwc
は無視され、で指定されたファイルを読み取ろうとし、f
ディレクトリの場合は失敗します。
私はこれがあなたが望むものだと思います
for f in ./* ; do ls "$f" | wc -l ; done
これはls
、inという名前のディレクトリで実行され、その中のf
行数を数えます。ただし、ls
名前がドットで始まるファイルは無視される可能性があり(およびスキップしてファイルも一覧表示されますls -A
).
、..
globは通常のファイルと一致する可能性があります(そのホームディレクトリにある場合)。
しかし、実際にはそうする必要はありませんし、ls
まったくありませんwc
。 OS X には Bash が必要で、次のように動作します。
shopt -s dotglob # '*' matches files with a leading dot, too
for f in ./*/ ; do # trailing slash only picks directories
set -- "$f"/* # fill the positional params with the filenames in the dir
echo "$f $#" # print the directory name and number of params/files
done