Powershell的等效命令是Linux的:ls -al

10
我很少使用Powershell和Linux,所以对于ls -al在Powershell中的对应命令不确定。我尝试找到一些信息,但它说在Powershell中没有等效的命令。这似乎很奇怪,所以我想快速询问一下。

严格的等价可能不存在。由于Linux和Windows是不同的操作系统。 - Basile Starynkevitch
@BasileStarynkevitch,确实没有严格的等价物,但考虑到PowerShell(Core)7+也可以在Linux(和macOS)上运行,我认为这不是关于不同平台的问题,而是关于以_Powershell惯用方式_获取_类似_功能的问题(在macOS和Linux上,您可以直接调用ls -al)。 - mklement0
1个回答

17

您使用的Unix实用程序ls的选项:

  • -a选项包括隐藏项目,这些项目在类Unix平台上是文件系统项目,其名称以.开头。

  • -l请求所谓的长格式,它生成包括文件系统项目的模式、用户和组所有权、最后的写入时间戳、项目大小和名称在内的表格输出。

PowerShell等效命令为:

Get-ChildItem -Force
  • Get-ChildItem-Force 开关在输出中包括隐藏的项目 - 尽管与 ls 不同的是,代表目标目录本身和其父目录的条目 ... 不被包含(这使得它成为更有用的 -A ls 选项的等价物)。

  • 默认情况下使用 长格式 格式;相反地,如果你只对文件名(相对路径)感兴趣,使用 -Name 开关。

  • 注意:Get-ChildItem 默认目标为当前位置(目录);要显式指定输入路径,请使用 -Path 参数 - 用于通配符模式 - 或 -LiteralPath 参数 - 用于字面(逐字)路径。第一个 位置参数(一个不带参数名称前缀的参数)隐式绑定到 -Path;例如,以下命令将目标定位到当前用户的主目录:

    Get-ChildItem -Force -LiteralPath $HOME
    

有一个lsGet-ChildItem之间的根本区别:

  • ls输出格式化文本,因此通常不推荐解析其输出。

  • 在PowerShell中,格式化数据分开,并且输出的是对象而不是字符串

    • 也就是说,无论Get-ChildItem输出在终端中呈现的丰富显示格式如何,其实际输出都是类型为System.IO.FileInfoSystem.IO.DirectoryInfo对象。如果捕获到一个变量中,通过管道发送到其他PowerShell命令或用于表达式,则可以安全地用于进一步的程序处理
  • 例如,表达式(Get-ChildItem -Force).FullName会输出当前目录中所有项目的完整路径。


为了交互方便(不应在脚本中这样做),可以使用内置别名无歧义的参数名称前缀缩短命令

gci -fo

gci 是内置的别名,用于代替 Get-ChildItem 命令,其名称遵循 PowerShell 的命名规则,其中每个所谓的核准动词也有一个经过核准的1-2字母的别名形式; 运行 Get-Verb Get 可以查看到核准的 Get 动词的别名为 g; 而名词部分没有正式规定,但记住 ci 代表的是 ChildItem 应该很容易。

-fo 是最短的参数名称前缀,可以明确地引用 -Force 开关(只使用 -f 还可能指代 -Filter[1]

  • 注意:有些参数本身实际上具有别名,例如 -h 代表 -Hidden-ad 代表 -Directory,但 -Force 没有。
  • 与不歧义的参数名称前缀不同,如果对命令添加新参数,前缀可能会变得不明确。参数别名在脚本中使用是安全的,但为了可读性,最好使用全名称。

要查看给定命令 (Get-ChildItem 在此示例中) 定义的所有别名:

PS> Get-Alias -Definition Get-ChildItem

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           dir -> Get-ChildItem                                          
Alias           gci -> Get-ChildItem                                          

如果要将输出限制为内置别名,即排除其他模块或$PROFILE脚本定义的别名,请运行pwsh -noprofile { Get-Alias -Definition Get-ChildItem }(在Windows PowerShell中,请使用powershell而不是pwsh)。

  • 上述内容显示了在macOS和Linux上的输出。
  • Windows上,您会发现ls另一个内置别名
    • 这是来自PowerShell作为仅适用于Windows的shell时的一个遗留别名最好避免使用

      • 通常情况下,别名优先于同名的外部程序,而重写平台的标准命令行实用程序并不是一个好主意;虽然这不适用于Windows上的别名ls,但是对其他情况适用,即where(重写了where.exe)和sc(仅适用于Windows PowerShell,重写了sc.exe

      • 具体而言,考虑到真正的Unix实用程序lsGet-ChildItem具有非常不同的语法(和行为),将后者公开为ls可能会导致混淆。

因此,建议使用那些缩写形式为PowerShell命令名称的别名,例如gci代替Get-ChildItem,以及gc代替Get-Content。尽管这一开始对于从熟悉的名称如ls/dircat进行过渡并没有帮助,但事实上,PowerShell cmdlet名称及其缩写别名是系统化和基于约定的,这使得更容易记忆它们。

使用function定义带有预设参数的方便“别名”:

bash这样的POSIX兼容shell允许您使用预设参数定义别名,例如alias ll='ls -al'

相比之下,PowerShell中的别名仅仅是名称映射,您需要声明一个函数(您可以将其添加到$PROFILE文件中以供将来会话使用):

# Equivalent of bash alias `alias ll='ls -al'`
function ll { ls -al @args }

或者类似的 gcih 函数(h 代表 hidden,即隐藏)基于 Get-ChildItem

function gcih { Get-ChildItem -Force @args }

有关PowerShell中别名和函数的更多信息,包括如何创建更复杂的包装函数,请参见此答案


[1] 概念上,它还可以指代-File参数,但从技术上来说,后者是一个动态的参数,特定于PowerShell的文件系统提供程序,因此在歧义检查期间不被考虑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接