PowerShell相当于Linux:ls -al [已关闭]

lf3rwulv  于 2023-11-17  发布在  Linux
关注(0)|答案(1)|浏览(121)

**已关闭。**此问题不符合Stack Overflow guidelines。目前不接受回答。

此问题似乎与a specific programming problem, a software algorithm, or software tools primarily used by programmers无关。如果您认为此问题与another Stack Exchange site的主题相关,可以发表评论,说明在何处可以回答此问题。
两年前关闭。
Improve this question
我不经常使用PowerShell和Linux,所以我不确定:ls -al在PowerShell中的“术语”是什么。我试图找到一些东西,但它说在PowerShell中没有等效的命令。看起来很奇怪,所以我想我会问快。

bvn4nwqk

bvn4nwqk1#

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

  • -a选项包括 hidden 项,这些项在类Unix平台上是名称以.开头的文件系统项
  • -l请求所谓的 long format,该格式生成表格输出,其中包括文件系统项的模式、用户和组所有权、上次写入时间戳、项大小及其名称。
    PowerShell等效为:
Get-ChildItem -Force

字符串

  • Get-ChildItem-Force开关在输出中包括 * 隐藏 * 项--尽管与ls不同,代表目标目录本身及其父目录的...条目 * 不包括 *(这使得它等效于更有用的-Als选项)。
  • 默认情况下使用 long format 格式;相反,如果您只对文件名(相对路径)感兴趣 *,请使用-Name开关。
  • 注意事项:默认情况下,Get-ChildItem以 * 当前 * 位置为目标(目录);若要显式指定输入路径,请使用-Path参数-(用于输入模式)或-LiteralPath参数-(用于文字(逐字)路径。第一个 * 位置 * 参数(一个没有前缀的参数名称)隐式绑定到-Path;例如,以下命令针对当前用户的主目录:
Get-ChildItem -Force -LiteralPath $HOME

请参阅底部部分的缩短此命令定义一个方便的“别名”(函数)
然而,lsGet-ChildItem之间有一个 * 基本 * 差异**:

  • ls输出 * 格式化文本 *,因此通常不鼓励解析其输出。
  • 在PowerShell中,* 格式 * 与 * 数据 * 是分开的,输出的是 * 对象 *,而不是 * 字符串 *。
  • 也就是说,不管Get-ChildItem输出在终端中呈现的丰富 * 显示格式 * 如何,其实际输出都是System.IO.FileInfoSystem.IO.DirectoryInfo类型的 * 对象 *,如果在变量中捕获,通过pipeline发送到其他PowerShell注解或在表达式中使用,则可以安全地用于进一步的 * 编程处理 *。
  • 例如,表达式(Get-ChildItem -Force).FullName输出当前目录中所有项目的 * 完整路径 *。
    为了 * 交互 * 方便(在脚本中不应该这么做),可以使用 * 内置别名 * 和 * 明确的参数名前缀 * 来缩短命令
gci -fo


gciGet-ChildItem的内置别名,其名称遵循PowerShell的命名约定,其中每个所谓的approved verb也有一个批准的1-2个字母 * 别名 * 形式;运行Get-Verb Get显示批准的Get动词的别名形式为g;虽然 * 名词 * 部分没有正式规定,但记住ci代表ChildItem应该很容易。
-fo是明确引用-Force交换机的最短参数名前缀(仅-f也可以引用-Filter [1])

  • 注意:某些参数本身有实际的 * 别名 *,例如-Hidden-h-Directory-ad,但-Force没有。
  • 与明确的参数名前缀不同,如果向命令中添加新参数,参数名前缀会随着时间的推移变得模糊,参数别名可以安全地用于脚本中,尽管为了可读性,全名更可取。

要查看为给定命令定义的 all 别名(本例中为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 命令名缩写形式的别名,例如Get-ChildItemgciGet-Contentgc。虽然这最初对从熟悉的名称(如ls/dircat)转换没有帮助,事实上,PowerShell小程序名称及其缩写别名是系统的,并且基于约定,这使得以后更容易记住它们。

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

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

相比之下,aliases in PowerShell仅仅是 * 名称Map *,您需要声明一个 * 函数 *(您可以将其添加到$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 }


请参阅this answer,了解有关PowerShell中别名与函数的更多信息,包括如何创建更复杂的 Package 函数。
[1]* 概念上 *,它也可以引用-File参数,但 * 技术上 * 后者是一个 * 动态 * 参数,特定于PowerShell的文件系统提供程序,因此在模糊性检查期间不会被考虑。

相关问题