【问题标题】:Powershell's equivalent to Linux's: ls -al [closed]等效于 Linux 的 Powershell:ls -al [关闭]
【发布时间】:2021-02-18 23:31:25
【问题描述】:

我不经常使用 Powershell 或 Linux,所以我不确定是什么: ls -al 将在 Powershell“术语”中。我试图找到一些东西,但它说 Powershell 中没有等效的命令。看起来很奇怪,所以我想我会尽快问。

【问题讨论】:

  • 可能不存在严格的等价物。由于 Linux 和 Windows 是不同的操作系统
  • @BasileStarynkevitch,确实没有 strict 等价物,但鉴于PowerShell (Core) 7+ 也可以在 Linux(和 macOS)上运行,这与不同平台无关,我想,但是关于获得 类似 功能的 Powershell 惯用方式(在 macOS 和 Linux 上,您可以直接调用 ls -al)。
  • butlertj10,即使这个问题现在已经结束(因为它不适合这个网站,虽然线条通常很模糊),你仍然可以向未来的读者发出一个答案帖子已经解决的信号通过接受它来解决您的问题-假设这就是它实际所做的。请允许我在下一条评论中给新人标准的建议:

标签: linux powershell


【解决方案1】:

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

  • -a 选项包括 hidden 项,在类 Unix 平台上是名称以 . 开头的文件系统项

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

PowerShell 等效项 是:

Get-ChildItem -Force
  • Get-ChildItem 的 -Force 开关在输出中包含 hidden 项 - 尽管与 ls 不同,. 和 .. 条目表示目标目录本身及其不包含父目录(这使得它相当于更有用的-A ls 选项)。

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

请参阅底部以了解缩短此命令和定义方便的“别名”(函数)。


ls 和 Get-ChildItem 之间有一个根本区别,但是:

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

  • 在 PowerShell 中,formatting 与 data 分开,输出的是 objects,而不是 strings。

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


为了交互方便(您不应该在脚本中这样做),您可以使用内置别名 em> 和 明确的参数名称前缀 以缩短命令:

gci -fo

gci 是Get-ChildItem 的内置别名,其名称遵循PowerShell 的命名约定,其中每个所谓的approved verb 也有一个经过批准的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,最好避免:

      • 一般来说,aliases take precedence 覆盖同名的外部程序,隐藏(覆盖)平台的标准命令行实用程序不是一个好主意;虽然这不适用于 Windows 上的别名 ls,但它适用于其他情况,即 where(阴影 where.exe)和 sc(仅限 Windows PowerShell,阴影 sc.exe)

      • 具体来说,鉴于真正的 ls Unix 实用程序和 Get-ChildItem 具有如此巨大不同的语法(和行为),将后者暴露为 ls 可能会引起混淆。

因此,建议使用那些是 PowerShell 命令名称的缩写形式的别名,例如 gci 代表 Get-ChildItem,gc 代表 @987654384 @。虽然这最初无助于从熟悉的名称(例如 ls / dir 和 cat 转换),但 PowerShell cmdlet 名称及其缩写别名是系统化且基于约定的,这使得记忆它们变得更容易继续前进。

使用function,使用预设参数定义一个方便的“别名”:

POSIX 兼容的 shell(例如 bash)允许您使用 preset 参数定义别名,例如 alias ll='ls -al'

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

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

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

function gcih { Get-ChildItem -Force @args }

请参阅this answer,了解有关 PowerShell 中别名与函数的更多信息,包括如何创建更复杂的包装函数。


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

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多