【问题标题】:Match all files under all nested directories with shell globbing使用 shell globbing 匹配所有嵌套目录下的所有文件
【发布时间】:2011-05-19 22:38:46
【问题描述】:

有没有办法使用 shell globbing 来识别嵌套目录?

所以如果我有 dir/dir1/dir2/dir3/dir4/dir5/.. 并且我在所有这些文件下都有文件,那么匹配所有目录下所有文件的等效通配模式是什么,类似于 - 例如 - ls -R

【问题讨论】:

标签: linux bash shell shopt


【解决方案1】:

在 Bash 4 中,使用 shopt -s globstar 和 zsh,您可以使用 **/*,它将包括除隐藏文件之外的所有内容。您可以在 Bash 4 中执行 shopt -s dotglob 或在 zsh 中执行 setopt dotglob 以包含隐藏文件。

在 ksh 中,set -o globstar 启用它。我认为没有办法隐式包含点文件,但我认为 **/{.[^.],}* 有效。

【讨论】:

  • 太酷了!为 shell globbing 解析的文件(例如 .gitignore)会使用这些设置吗?
  • @Samer Abukhait:如果 shell 正在执行 globbing,那么它应该这样做。
  • @Samer:但是 gitignore 没有使用 shell globbing,它使用的是 fnmatch。
【解决方案2】:

特别是关于 git(gitignore、gitattributes 和采用文件名的命令):如果模式不包含斜杠,* 通配符将匹配深度。如果它确实包含斜杠,git will call fnmatchFNM_PATHNAME 标志,简单的通配符将不匹配斜杠。不支持 ** 匹配深度。也许这种深度匹配可以通过新的FNM_STARSTAR 标志得到更广泛的支持,并在 glibc、gnulib 和其他地方实现。

【讨论】:

    【解决方案3】:

    如果您想对 find 返回的所有文件进行操作,而不仅仅是列出它们,您可以将它们通过管道传递给 xargs:

    find <directory> -type f | xargs ls
    

    但这仅适用于没有递归标志的命令。

    【讨论】:

      【解决方案4】:

      你可以试试:

      **/*.*
      

      但它会忽略隐藏文件(例如.git 文件)。有时它可以挽救生命。

      阅读更多内容:What expands to all files in current directory recursively?@SO

      【讨论】:

        【解决方案5】:

        你可以使用树,它会递归显示所有文件夹。

        tree <path>
        

        【讨论】:

          【解决方案6】:

          普通 Bash 无法做到这一点,但是大多数命令都接受 -R--recursive 选项来告诉它们进入目录。

          如果您只想列出位于目录或其子目录中任何位置的所有文件,您可以使用find

          递归查找具有给定目录的文件 (-type f):

          find <directory> -type f
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-10-01
            • 1970-01-01
            • 2011-03-07
            • 2014-03-08
            • 1970-01-01
            • 1970-01-01
            • 2013-12-31
            • 2019-01-04
            相关资源
            最近更新 更多