このコマンドは機能しますが、forループ内で使用すると機能しません。

このコマンドは機能しますが、forループ内で使用すると機能しません。

ユーザーフォルダ内のすべてのユーザーを繰り返し、各ホームディレクトリにあるファイル数を印刷しようとしています。 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これにより、現在のディレクトリ()のすべてのファイル名が設定されます。./*各ファイルに対して、現在のディレクトリのすべてのファイル名を使用して再実行され、出力lswc -l $fwc -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

おすすめ記事