这个命令有效,但是当我在 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为当前目录 ( ) 中的所有文件名。./*对于每个文件,它都会ls使用当前目录中的所有文件名再次运行,将输出通过管道传输到wc -l $f.现在,wc -l计算作为参数给出的文件中的行数,并且仅在没有行数时才查看 stdin。因此,管道在wc这里被忽略,它尝试读取 中指定的任何文件f,当它是目录时失败。

我怀疑你想要的是这样的

for f in ./* ; do ls "$f" | wc -l ; done

它将ls在名为 in 的目录上运行f,然后计算其中的行数。但ls可能会忽略名称以点开头的文件(ls -A也列出它们,跳过...),并且 glob 也可能与常规文件匹配(如果该主目录中有任何文件)。

但你真的不需要lswc根本不需要。 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

相关内容