在文件中搜索 in/for 文本
Search in/for text in files
我目前正在学习LPTHW Ex 46。在他的视频教程中,Zed 执行了以下命令:
使用 grep -r "NAME" *
在文件中查找 NAME。
使用 find . -name "*pyc" -print
.
查找所有扩展名为 .pyc 的文件
不幸的是,以上代码在 Windows PowerShell 上不起作用。我可以知道他们的 Windows PowerShell 等价物是什么吗?
根据我的搜索,第 1 项可以替换为 Select-String
。但是,它不如我们只能搜索特定文件而不能搜索目录。例如,虽然这可行:
Select-String C:\Users\KMF\Exercises\Projects\gesso\gesso\acrylic.py -pattern "NAME"
这不会:
Select-String C:\Users\KMF\Exercises\Projects\gesso -Pattern "NAME"
并给出以下错误
Select-String : The file C:\Users\KMF\Exercises\Projects\gesso can not be read: Access to the path 'C:\Users\KMF\Exercises\Projects\gesso' is denied.
对于项目 2,我找不到类似的功能。
grep
和 find
是 Unix/Linux shell 命令。除非您安装它们的 Windows 端口,否则它们将无法在 PowerShell 中工作。
如您所知,Select-String
是 grep
的 PowerShell 等价物。但是,它本身不会递归,因此您必须将它与 Get-ChildItem
结合起来以模拟 grep -r
:
Get-ChildItem -Recurse | Select-String -Pattern 'NAME'
要模拟 find
,您需要将 Get-ChildItem
与 Where-Object
过滤器结合使用:
Get-ChildItem -Recurse | Where-Object { $_.Extension -eq '.pyc' }
PowerShell cmdlet 可以使用别名来帮助管理员避免大量输入(因为 PowerShell 语句往往相当冗长)。有几个 built-in 别名,例如ls
或 dir
代表 Get-ChildItem
,?
或 where
代表 Where-Object
。您还可以定义自己的别名,例如New-Alias -Name grep -Value Select-String
。只要 t运行 指定的参数名称对于 cmdlet 保持唯一,就可以缩短参数名称。当 cmdlet 允许位置参数时,它们甚至可以完全省略。
通过以上所有内容,您的两个 PowerShell 语句可以简化为以下内容:
ls -r | grep 'NAME'
ls -r | ? { $_.Extension -eq '.pyc' }
但是请注意,别名和缩写主要是为了增强对控制台的使用。对于 PowerShell 脚本,您应该始终使用完整形式,这不仅是为了可读性,也是因为别名可能因环境而异。您不希望您的脚本因为 运行 由其他人编写而中断。
我目前正在学习LPTHW Ex 46。在他的视频教程中,Zed 执行了以下命令:
使用
grep -r "NAME" *
在文件中查找 NAME。使用
find . -name "*pyc" -print
. 查找所有扩展名为 .pyc 的文件
不幸的是,以上代码在 Windows PowerShell 上不起作用。我可以知道他们的 Windows PowerShell 等价物是什么吗?
根据我的搜索,第 1 项可以替换为 Select-String
。但是,它不如我们只能搜索特定文件而不能搜索目录。例如,虽然这可行:
Select-String C:\Users\KMF\Exercises\Projects\gesso\gesso\acrylic.py -pattern "NAME"
这不会:
Select-String C:\Users\KMF\Exercises\Projects\gesso -Pattern "NAME"
并给出以下错误
Select-String : The file C:\Users\KMF\Exercises\Projects\gesso can not be read: Access to the path 'C:\Users\KMF\Exercises\Projects\gesso' is denied.
对于项目 2,我找不到类似的功能。
grep
和 find
是 Unix/Linux shell 命令。除非您安装它们的 Windows 端口,否则它们将无法在 PowerShell 中工作。
如您所知,Select-String
是 grep
的 PowerShell 等价物。但是,它本身不会递归,因此您必须将它与 Get-ChildItem
结合起来以模拟 grep -r
:
Get-ChildItem -Recurse | Select-String -Pattern 'NAME'
要模拟 find
,您需要将 Get-ChildItem
与 Where-Object
过滤器结合使用:
Get-ChildItem -Recurse | Where-Object { $_.Extension -eq '.pyc' }
PowerShell cmdlet 可以使用别名来帮助管理员避免大量输入(因为 PowerShell 语句往往相当冗长)。有几个 built-in 别名,例如ls
或 dir
代表 Get-ChildItem
,?
或 where
代表 Where-Object
。您还可以定义自己的别名,例如New-Alias -Name grep -Value Select-String
。只要 t运行 指定的参数名称对于 cmdlet 保持唯一,就可以缩短参数名称。当 cmdlet 允许位置参数时,它们甚至可以完全省略。
通过以上所有内容,您的两个 PowerShell 语句可以简化为以下内容:
ls -r | grep 'NAME'
ls -r | ? { $_.Extension -eq '.pyc' }
但是请注意,别名和缩写主要是为了增强对控制台的使用。对于 PowerShell 脚本,您应该始终使用完整形式,这不仅是为了可读性,也是因为别名可能因环境而异。您不希望您的脚本因为 运行 由其他人编写而中断。