powershell@查找文件或目录文件夹

查找所有目录@文件

  • 列出一个目录下所有层级子目录,而不显示文件

    • ls -Recurse -Directory

    • 可以指定字段,紧凑地显示ls -Recurse -Directory|select name,FullName

    • PS 🕰️1:43:56 AM [C:\repos\scripts\ModulesByCxxu] 🔋100% ls -Recurse -Directory|select name,FullName
      Name FullName
      ---- --------
      .vscode C:\repos\scripts\ModulesByCxxu\.vscode
      Aliases C:\repos\scripts\ModulesByCxxu\Aliases
      colorSettings C:\repos\scripts\ModulesByCxxu\colorSettings
  • 列出一个目录下所有文件(而不显示子目录),是类似地

    • ls -Recurse -File
    • 紧凑显示(和目录的类似)ls -Recurse -Directory|select FullName
  • 统计目录下子目录或文件的数量

    • 文件数量ls -Recurse -Directory|Measure-Object |select count
    • 目录数量类似

搜索文件(search files)

简单搜索

  • 根据文件名搜索文件:通常使用ls -file $pattern即可扫描当前目录,如果需要递归扫描,带上-R参数

    • PS 🕰️9:37:10 PM [C:\repos\scripts] 🔋100% ls -file *.txt -Recurse
      Directory:
      C:\repos\scripts\linuxShellScripts\linuxShellScripts_bak\sedLearn
      Mode LastWriteTime Length Name
      ---- ------------- ------ ----
      -a--- 3/29/2022 6:26 PM 38 󰈙 coleridge.txt
      -a--- 3/29/2022 6:26 PM 429 󰈙 data.txt
      Directory: C:\repos\scripts\linuxShellScripts\sedLearn
      Mode LastWriteTime Length Name
      ---- ------------- ------ ----
      -a--- 1/16/2024 2:32 PM 38 󰈙 coleridge.txt
      -a--- 3/30/2022 8:22 PM 1149 󰈙 input.txt
      -a--- 3/30/2022 11:54 PM 277 󰈙 output.txt
  • 如果要扫描指定目录,使用-path参数

    • PS 🕰️9:40:50 PM [C:\repos\scripts] 🔋100% ls -file *.txt -R -path C:\repos\scripts\startup\
      Directory: C:\repos\scripts\startup\log
      Mode LastWriteTime Length Name
      ---- ------------- ------ ----
      -a--- 2/12/2024 1:38 PM 453 󰈙 log.txt
      -a--- 2/12/2024 12:58 PM 500 󰈙 MapLog.txt
  • 如果要将结果紧凑的展示,考虑用select(即select-object)来进一步处理

    • PS 🕰️9:46:08 PM [C:\repos\scripts] 🔋100% ls -file *.txt -R|select name,FullName
      Name FullName
      ---- --------
      coleridge.txt C:\repos\scripts\linuxShellScripts\linuxShellScripts_bak\se…
      data.txt C:\repos\scripts\linuxShellScripts\linuxShellScripts_bak\se…
      coleridge.txt C:\repos\scripts\linuxShellScripts\sedLearn\coleridge.txt
      input.txt C:\repos\scripts\linuxShellScripts\sedLearn\input.txt
      output.txt C:\repos\scripts\linuxShellScripts\sedLearn\output.txt
      0.txt C:\repos\scripts\pythonScripts\test_rename_dir\0.txt
      1.txt C:\repos\scripts\pythonScripts\test_rename_dir\1.txt
      log.txt C:\repos\scripts\startup\log\log.txt
      MapLog.txt C:\repos\scripts\startup\log\MapLog.txt

显示输出格式控制函数版本

  • 函数本身不长,主要是文档和用法说明占了大量篇幅(为了快速该掌握函数的用法)

    function search_item
    {
    param(
    #这个参数传给ls 的-filter ,因此pattern变量也可以命名为filter,或filter_pattern
    $pattern = '',
    #指定要在哪个目录展开扫描
    $path = '.',
    # 是否显示路径的类型,是一个开关式参数
    [switch]$PathType,
    #该参数可以接受ls 同样的参数[注意pattern,path两个参数比较常用,这里要放在外部单独传入]
    $args_ls = '',
    #该参数是select-object处理ls 管道传输过来的对象,常用的字段比如:FullName
    $args_select = ''
    )
    Write-Output "pattern:$pattern"
    $RelativePath = @{
    Name = 'RelativePath';
    Expression = {
    '.' + ((Resolve-Path $_) -replace ($pwd -replace '\\', '\\'), '')
    }
    #这里自定义一个字段用来计算相对路径字段,这里用的是-replace,需要对正则有所了解;
    # 也可以用字符串方法定位和移除文件绝对路径的工作目录部分
    }
    #定义显示路径是文件还是文件夹的字段,比如也可以命名为FileOrDirectory,不要和参数$PathType混淆
    $Type = @{n = 'Type'; e =
    {
    $_.PSIsContainer ? 'Directory' : 'File'
    }
    }
    #利用where过滤掉空字符串参数
    $fields = 'name', ($PathType ? $Type : ''), $RelativePath | Where-Object { $_ -ne '' }
    # Write-Output "[$($fields -join ',')]"
    #使用三元运算符,根据参数$args_select 是否来创建新数组,以便传递给select 筛选需要的字段
    $fields = $args_select -ne '' ? ($fields + $args_select):$fields
    "Get-ChildItem -filter $pattern -R $args_ls" | Invoke-Expression | Select-Object $fields
    <#
    .SYNOPSIS
    从当前目录开始递归查找具有指定名称的文件或者目录,尽可能以紧凑表格的方式列出,允许自定义文件信息字段
    如果指定的字段过多,比如总数达到5个或更多会变成列表式(Name,type,RelativePath)始终显示;也可以用管道符`|ft`强制为表格输出
    当然可以修改代码改变这一默认行为(例如在windows下往往没有后缀名的就是文件夹,显示路径类型可能有点鸡肋,
    但是有时还是有用的,比如我们希望排序,让文件列在前面而目录在后等)
    (需要对ls返回的对象有所了解,结合select 筛选需要的字段)
    显示找到的文件的名称,以及其相对于当前工作目录的路径,可以指定更多字段,当然也支持根据字段进行排序
    有的目录或文件格式往往不要扫描,例如node_modules,可以传入 -Exclude '*node_modules*'(或者配置为默认跳过)
    本函数主要是对ls所作的一个包装,将递归扫描的结果紧凑的显示出来,并且计算了相对路径(如果从当前目录开始扫描)
    .EXAMPLE
    PS 🕰️11:31:45 PM [C:\Users\cxxu\Desktop] 🔋100% search_item -pattern *.txt -args_select basename,fullname
    pattern:*.txt
    Name RelativePath BaseName FullName
    ---- ------------ -------- --------
    demo.txt .\demo.txt demo C:\Users\cxxu\Desktop\demo.txt
    .EXAMPLE
    PS 🕰️12:29:58 PM [C:\repos\scripts] 🔋100% search_item *log -args_select fullname
    pattern:*log
    Name RelativePath FullName
    ---- ------------ --------
    aira.log .\aria\aira.log C:\repos\scripts\aria\aira.log
    log .\data\log C:\repos\scripts\data\log
    log.log .\data\log\log.log C:\repos\scripts\data\log\log.log
    20221223(0).log .\Logs\20221223(0).log C:\repos\scripts\Logs\20221223(0).log
    log .\startup\log C:\repos\scripts\startup\log
    .EXAMPLE
    PS 🕰️12:30:03 PM [C:\repos\scripts] 🔋100% search_item *log -args_select fullname -PathType
    pattern:*log
    Name Type RelativePath FullName
    ---- ---- ------------ --------
    aira.log File .\aria\aira.log C:\repos\scripts\aria\aira.log
    log Directory .\data\log C:\repos\scripts\data\log
    log.log File .\data\log\log.log C:\repos\scripts\data\log\log.log
    20221223(0).log File .\Logs\20221223(0).log C:\repos\scripts\Logs\20221223(0).log
    log Directory .\startup\log C:\repos\scripts\startup\log
    .EXAMPLE
    PS 🕰️12:31:08 PM [C:\repos\scripts] 🔋100% search_item *log -args_select fullname -PathType |sort type
    Name Type RelativePath FullName
    ---- ---- ------------ --------
    log Directory .\data\log C:\repos\scripts\data\log
    log Directory .\startup\log C:\repos\scripts\startup\log
    aira.log File .\aria\aira.log C:\repos\scripts\aria\aira.log
    .EXAMPLE
    PS 🕰️12:31:26 PM [C:\repos\scripts] 🔋100% search_item *log -args_select fullname -args_ls "-file"
    pattern:*log
    Name RelativePath FullName
    ---- ------------ --------
    aira.log .\aria\aira.log C:\repos\scripts\aria\aira.log
    log.log .\data\log\log.log C:\repos\scripts\data\log\log.log
    20221223(0).log .\Logs\20221223(0).log C:\repos\scripts\Logs\20221223(0).log
    .EXAMPLE
    #共有5个字段,因此会变成列表式输出(可能收powershell版本影响)
    PS 🕰️12:53:58 AM [C:\repos\scripts] 🔋100% search_item *log -args_select basename,fullname -pathType
    pattern:*log
    Name : aira.log
    Type : File
    RelativePath : .\aria\aira.log
    BaseName : aira
    FullName : C:\repos\scripts\aria\aira.log
    Name : log
    Type : Directory
    RelativePath : .\data\log
    BaseName : log
    FullName : C:\repos\scripts\data\log
    .EXAMPLE
    PS 🕰️12:33:54 PM [C:\repos\scripts] 🔋100% search_item *rename* -args_select basename,fullname -PathType|ft
    pattern:*rename*
    Name Type RelativePath BaseName FullName
    ---- ---- ------------ -------- --------
    rename_prefix.data.json File .\.mypy_cache\3.12\rename_prefix.data.json rename_prefix.data C:\repos\scripts\.mypy…
    rename_prefix.meta.json File .\.mypy_cache\3.12\rename_pre
    #>
    }
  • 查看帮助文档和用例

    PS 🕰️11:41:19 PM [C:\Users\cxxu\Desktop] 🔋100% help search_item
    NAME
    search-item
    SYNOPSIS
    ....
    SYNTAX
    searchFiles_tight [[-pattern] <Object>] [[-path] <Object>] [[-args_ls] <Object>] [[-args_select] <Object>]
    [<CommonParameters>]

TODO

  • 函数进一步加入管道符的支持
posted @   xuchaoxin1375  阅读(29)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示