Linux 命令 wc -l 的 Windows 等效项是什么?

What is the windows equivalent of Linux command wc -l?

提问人:user2954167 提问时间:6/22/2018 更新时间:3/22/2023 访问量:9297

问:

我有一段代码,旨在将以下内容发送到 linux 命令行:

wc -l C:/inputdirectory/P*

但是,我需要在 Windows 中运行此脚本,并尝试找到等效的命令。我试过了

查找 /c /v C:/inputdirectory/P*

但这会引发一个错误,即 /v 不是有效的命令。你能告诉我为什么这不起作用吗?

*注意,命令本身并没有说“inputdirectory”,它有正确的目录,只是太乏味和私密而无法输入

Linux Windows 命令行 cmd

评论

2赞 Eryk Sun 6/22/2018
尝试搜索 ,即空字符串;仅使用反斜杠作为路径分隔符;如果路径中有空格,请引用该路径:.""find /c /v "" "C:\inputdirectory\P*"
3赞 LMC 6/22/2018
Cygwin 提供了许多移植到 Windows 的 Linux 实用程序。“在 Windows 上获得 Linux 的感觉”。
2赞 SomeWittyUsername 6/25/2018
如果您使用的是 Win10,则拥有包含所有 Linux 好东西的 WSL
0赞 lit 10/3/2020
这是一个很好的答案。stackoverflow.com/a/54893466/447901

答:

3赞 user2954167 6/22/2018 #1

图片由 Eryk Sun 提供:

尝试搜索 ,即空字符串;仅使用反斜杠作为路径分隔符;如果路径中有空格,请引用该路径:""

find /c /v "" "C:\inputdirectory\P*"

评论

1赞 lit 6/22/2018
FIND /C /V并不完全等同于 .它发出一串破折号,后跟文件名,然后是计数。 而,仅发出计数。wc -l---------- README.TXT: 41wc -l
2赞 DavidPostill 6/25/2018 #2

如何计算一组文件中的行数?

使用以下批处理文件 (CountLines.cmd):

@echo off
Setlocal EnableDelayedExpansion
for /f "usebackq" %%a in (`dir /b %1`)  do (
  for /f "usebackq" %%b in (`type %%a ^| find "" /v /c`) do (
    set /a lines += %%b
    )
  )
echo %lines%
endlocal

用法:

CountLines C:/inputdirectory/P*

延伸阅读

  • Windows CMD 命令行的 AZ 索引 - 与 Windows cmd 行相关的所有内容的绝佳参考.
  • dir - 显示文件和子文件夹的列表。
  • find - 在文件中搜索文本字符串并显示找到它的所有行。
  • for /f - 针对另一个命令的结果循环命令。

评论

1赞 Eryk Sun 9/7/2019
如果不明显,如果我们通过管道将文件传递给 ,则摘要标头没有文件名,因此仅输出行数。内部“循环”提取此结果,在本例中,将其添加到所有已处理文件的运行总行中。typefindfindfor /f
0赞 mklement0 9/9/2019
这是一个有趣的练习,用于报告多个文件的总行数但事实并非如此;后者以 的形式报告每个输入文件的计数,这也是在传递文件参数时直接执行的操作,撇开格式细节的差异不谈。wc -l C:/inputdirectory/P*<count> <file>find.exe
3赞 mklement0 9/9/2019 #3

注意:如果您只需要单个输入文件的行数,则一个简单的解决方案(将整个文件加载到内存中)是,例如(gc file.txt)。CountgcGet-Content 的内置别名)。
更快的版本:(gc -ReadCount 0 file.txt)。计数

从已过时cmd.exe(命令提示符/批处理文件):

在 PowerShell 中,有两个选项:From PowerShell, you have two options

  • 选项 A(次优):也使用公认的答案,稍作调整:
find --% /c /v "" "C:\inputdirectory\P*"

注意:停止分析符号指示 PowerShell 将后续参数按原样传递到目标程序(在展开 -style 环境变量引用(如 ,如果有)之后)。--%cmd%USERNAME%

在手头的情况下,这可以防止 PowerShell 进行解析,并且错误地忽略将其传递到外部目标程序 ()。""find.exe

有关 PowerShell 在调用外部程序时处理引号的严重问题的摘要,请参阅此答案

上述命令的输出 - 实际上,任何外部程序都只是文本,在这种情况下,它看起来像这样:find.exe

---------- PFILE1.TXT: 42

---------- PFILE2.TXT: 666

...

虽然这种输出对于人类观察者来说很容易掌握,但它使后续的编程处理变得繁琐,因为需要文本解析。

如下所述,使用 PowerShell 本机命令 (cmdlet) 提供了更大的灵活性,因为 PowerShell 命令通常发出具有类型化属性对象,这极大地方便了后续处理。


  • 选项 B(首选将 PowerShell 自己的 Measure-Object cmdlet 与 -Line 开关配合使用:

注意:虽然此命令比解决方案更冗长,但由于输出具有类型化属性对象,它最终提供了更大的灵活性,这极大地方便了后续处理;此外,PowerShell 复杂的输出格式系统提供了用户友好的默认表示形式。find

Get-Item -Path "C:\inputdirectory\P*" -PipelineVariable file | ForEach-Object {
  Get-Content -LiteralPath $file |
    Measure-Object -Line |
      Select-Object @{ Name='File'; Expression={ $file } }, Lines
}

上面输出具有 .File.Lines 属性,PowerShell 默认按如下方式打印:

File                         Lines
----                         -----
C:\inputdirectory\Pfile1.txt    42
C:\inputdirectory\Pfile2.txt   666
...

除了更漂亮的输出呈现之外,输出的面向对象特性使得以编程方式处理结果变得容易。

例如,如果要将输出限制为行数大于或更大的文件,请通过管道传递到对上述命令的以下 Where-Object 调用:100

... | Where-Object Lines -ge 100

如果(另外)想要先按最高行数排序,请通过管道传递到 Sort-Object cmdlet:

... | Sort-Object -Descending Lines

评论

0赞 MarkHu 3/22/2023
这个答案的冗长部分是粗暴的。superuser.com/questions/959036/ 中描述了一种更简化的方法... TL/DR:cat file.txt | Measure-Object -line
1赞 mklement0 3/22/2023
@MarkHu,您的命令所做的只是 (a) 替换为其别名(在 Windows 上),(b) 应用于单个输入文件,以及 (b) 不生成输出。换句话说:你正在回答一个不同的、更简单的问题,解决方案更短也就不足为奇了。如果您只想知道单个文件的行数,请使用Get-ContentcatMeasure-Object -Linewc -l(cat file.txt).Count
0赞 mklement0 3/22/2023
@MarkHu,至于链接的 SU 帖子中显示的内容:只需使用 - 根本不需要。( 是 的内置别名,就像在 Windows 上一样;但是,在类 Unix 平台上,指的是外部实用程序)。(ls | Measure-Object -line).Lines(gci).CountMeasure-ObjectgciGet-ChildItemlsls/bin/ls