您使用的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
有一个ls
和Get-ChildItem
之间的根本区别:
ls
输出格式化文本,因此通常不推荐解析其输出。
在PowerShell中,格式化与数据分开,并且输出的是对象而不是字符串。
Get-ChildItem
输出在终端中呈现的丰富显示格式如何,其实际输出都是类型为System.IO.FileInfo
和System.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
)。
ls
是另一个内置别名。
这是来自PowerShell作为仅适用于Windows的shell时的一个遗留别名,最好避免使用:
通常情况下,别名优先于同名的外部程序,而重写平台的标准命令行实用程序并不是一个好主意;虽然这不适用于Windows上的别名ls
,但是对其他情况适用,即where
(重写了where.exe
)和sc
(仅适用于Windows PowerShell,重写了sc.exe
)
具体而言,考虑到真正的Unix实用程序ls
和Get-ChildItem
具有非常不同的语法(和行为),将后者公开为ls
可能会导致混淆。
因此,建议使用那些缩写形式为PowerShell命令名称的别名,例如gci
代替Get-ChildItem
,以及gc
代替Get-Content
。尽管这一开始对于从熟悉的名称如ls
/dir
和cat
进行过渡并没有帮助,但事实上,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的文件系统提供程序,因此在歧义检查期间不被考虑。
ls -al
)。 - mklement0