我试图遍历用户文件夹中的所有用户,并打印出他们每个人的主目录中有多少个文件。当我在 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 也可能与常规文件匹配(如果该主目录中有任何文件)。
但你真的不需要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