Answers:
在这里你可以这样
ls -lR /path/to/dir/*.jpg | wc -l
这给你数
-R呢?stat只需要文件名时为什么要进行完整备份?为什么不ls -1 *.jpg| wc -l呢?(好的,如果您的文件名中包含换行符,则不起作用。在这种情况下,您应得到它;-) ...)
.jpg
*.jpg被shell扩展,而不是被扩展ls),并且文件名中以连字符开头,则失败。
不幸的是,这种良性问题很难以支持所有文件名并且可移植的方式解决。这是安全的(它处理隐藏文件,包含空格,破折号甚至换行符的路径)并且与POSIX兼容:
find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c
如果您不希望它是递归的,只需添加-maxdepth 1。
测试:
$ cd -- "$(mktemp -d)"
$ touch -- -foo.mp4 .bar.mp4 .bat.mp4 'baz.mp4
> ban.mp4'
$ find . -mindepth 1 -type f -name "*.mp4" -exec printf x \; | wc -c
4
与接受的答案进行比较:
$ ls -lR ./*.mp4 | wc -l
3
或其他建议:
$ find . -name "*.mp4" | wc -l
5
$ ls -1 *.mp4 | wc -l
ls: invalid option -- '.'
Try 'ls --help' for more information.
0
$ find . -name "*.mp4" | wc -c # Answer fixed at a later time
51
$ find . -name "*.mp4" | wc -l
5
$ find . | grep -i ".mp4$" | wc -l
5
$ ls . | grep ".mp4$" | wc -l
3
-printf不支持POSIXfind,这就是为什么我不使用它。
-mindepth和-maxdepth您使用的。
find包含-mindepth和-maxdepth,但不包含-printf,所以我很欣赏双方的包容性。
该文件按扩展名依次查找,排序和列出所有文件:
find . -type f | sed 's/.*\.//' | sort | uniq -c
| sort -rn在末尾添加一个,-mindepth 1如果只是当前目录,也可以添加一个。
head -n获得前n个。
您可以使用ls -1 *.mp4 | wc -l。
这将列出所有以结尾的.mp4文件,将每个文件打印在新行(ls -1 *.mp4)上,并将输出通过管道传输到wc该行,该输出将使用该-l标志计算新行数。
*.mp4不是由Shell扩展ls,因此如果.mp4目录中的文件太多而无法将其列表ls作为参数传递,则失败。
--.mp4
--将解决第二种情况;前者会出现错误消息(您需要很多文件!),而这里还有另一个不错的问题。极端情况,但值得注意的是。
这应该给你带.mp4的文件列表
ls /path/to/directory | grep ".mp4$"
当与结合wc -l时会给你计数
ls /path/to/directory | grep ".mp4$" | wc -l
如果要搜索以包含子目录
ls -lR /path/to/directory | grep ".mp4$" | wc -l
wc -l
ls /directory/*.mp4会导致Shell扩展glob并执行类似的操作,ls /directory/file1.mp4 /directory/file2.mp4 ...如果该目录包含的mp4文件超出了作为参数传递给的mp4文件,则此操作将失败ls。
在bash中,一种冷酷的手段是将数组与glob结合使用:
$ files=( *.mp4 )
$ echo ${#files[@]}
30
ls | grep --count \.csv$
替换(.csv为所需的扩展名)
说明:我认为一个简单的方案是获取文件列表,并使用grep计算扩展名。\.匹配.并$匹配行尾的扩展名。之所以起作用,是因为通过管道输出ls的输出时,每行发送一个文件名,您可以通过运行以下命令进行验证:
ls | cat
grep --count,您也可以使用代替grep -c。
检查如何在Linux中按扩展名计数文件?,它给出了很好的答案和解释,您可以使用以下命令:
find . -type f | sed -n 's/..*\.//p' | sort | uniq -c
ls -1在这种情况下,对换行符的处理使解析ls输出变得明智。标记为-R的标志是错误的。