如何正确匹配子目录中的文件名?

卡波

我目前正在阅读《Real World Haskell》一书,该书中的一个练习要求读者使用来实现文件名匹配,该用法**与相同*,但在文件系统的所有子目录中也进行查找。下面是我的代码片段,带注释(此刻有很多重复),进一步,您可以找到有关该代码的其他信息。我认为发布的代码足以解决问题,因此无需在此处列出整个程序。

case splitFileName pat of
        ("", baseName) -> do -- just the file name passed
            curDir <- getCurrentDirectory
            if searchSubDirs baseName -- check if file name has `**` in it
              then do 
                  contents <- getDirectoryContents curDir
                  subDirs <- filterM doesDirectoryExist contents
                  let properSubDirs = filter (`notElem` [".", ".."]) subDirs
                  subDirsNames <- forM properSubDirs $ \dir -> do
                                      namesMatching (curDir </> dir </> baseName) -- call the function recursively on subdirectories
                  curDirNames <- listMatches curDir baseName -- list matches in the current directory
                  return (curDirNames ++ (concat subDirsNames)) -- concatenate results into a single list
              else listMatches curDir baseName
        (dirName, baseName) -> do // full path passed
            if searchSubDirs baseName
              then do
                  contents <- getDirectoryContents dirName
                  subDirs <- filterM doesDirectoryExist contents
                  let properSubDirs = filter (`notElem` [".", ".."]) subDirs
                  subDirsNames <- forM properSubDirs $ \dir -> do
                                      namesMatching (dirName </> dir </> baseName) -- call the function recursively on subdirectories
                  curDirNames <- listMatches dirName baseName -- list matches in the passed directory
                  return (curDirNames ++ (concat subDirsNames)) -- concatenate results into a single list

附加信息:

pat是我正在寻找的模式(例如*.txtC:\\A\[a-z].*)。

splitFileName是将文件路径分为目录路径和文件名的功能。如果我们仅在中指定文件名,则元组的第一个元素将为空pat

searchSubDirs返回True文件名是否包含**在其中。

listMatches返回目录匹配模式的,用文件名列表***

namesMatching 是我发布其摘录的函数的名称。

为什么不起作用?

当我仅传递文件名时,程序仅在当前目录和第一级子目录中搜索它。当我传递完整路径时,它仅在指定目录中搜​​索。看来大小写(dirName, baseName)没有正确递归。我已经看了一段时间的代码了,但我不知道问题出在哪里。

笔记

如果需要更多信息,请在评论中让我知道,我将在问题中添加所有必要内容。

埃里克

这是一个问题:

              contents <- getDirectoryContents dirName
              subDirs <- filterM doesDirectoryExist contents

getDirectoryContents仅返回目录的叶名称,因此您必须在之前在元素之前加上dirName(以及/contentsdoesDirectoryExist

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

mod_rewrite-如何匹配URL,但不匹配子目录?

来自分类Dev

匹配子目录

来自分类Dev

Bash-如何归档和压缩子目录中的文件,但只能使用特定的文件名

来自分类Dev

忽略根目录和子目录中的相同文件名

来自分类Dev

如何打开与子目录中的模式匹配的文件

来自分类Dev

仅列出bash中目录和子目录中的文件名

来自分类Dev

如何在单个目录中查找子目录中的文件并按文件名对它们进行排序?

来自分类Dev

的Python:列出目录/子目录与文件名

来自分类Dev

修改工作的AddHandler以仅匹配CURRENT目录中的文件,而不匹配子目录中的文件

来自分类Dev

如何在单个目录中查找子目录中的文件并按文件名对它们进行排序?

来自分类Dev

创建子目录并根据文件名中的日期按日期组织文件

来自分类Dev

更改父目录和子目录中的文件名

来自分类Dev

如何仅列出删除目录和子目录的文件名

来自分类Dev

如何从所有子目录中获取特定的文件名?

来自分类Dev

“查找”或“ grep”文件名以匹配目录和子目录中的模式

来自分类Dev

查找与文件名匹配的子目录

来自分类Dev

将所有文件移动到文件名开头的子目录中

来自分类Dev

如何打开与子目录中的模式匹配的文件

来自分类Dev

匹配子目录

来自分类Dev

尝试解压缩子目录中的文件时出现错误:警告:文件名不匹配

来自分类Dev

将所有文件移动到以部分文件名命名的子目录中

来自分类Dev

制作脚本以基于文件名创建子目录并将匹配的文件移入其中

来自分类Dev

在Linux中将子目录中的文件名写入CSV文件

来自分类Dev

将递增值写入子目录中与文件名匹配的所有文件

来自分类Dev

Python-为什么fnmatch匹配子目录中的文件?

来自分类Dev

列出FTP目录及其子目录中的文件名

来自分类Dev

如何更改子目录中的文件名

来自分类Dev

如何在忽略文件名中的空格的同时遍历子目录并执行操作

来自分类Dev

ZSH 和 globstar 匹配子目录中的所有文件,但不匹配目录

Related 相关文章

  1. 1

    mod_rewrite-如何匹配URL,但不匹配子目录?

  2. 2

    匹配子目录

  3. 3

    Bash-如何归档和压缩子目录中的文件,但只能使用特定的文件名

  4. 4

    忽略根目录和子目录中的相同文件名

  5. 5

    如何打开与子目录中的模式匹配的文件

  6. 6

    仅列出bash中目录和子目录中的文件名

  7. 7

    如何在单个目录中查找子目录中的文件并按文件名对它们进行排序?

  8. 8

    的Python:列出目录/子目录与文件名

  9. 9

    修改工作的AddHandler以仅匹配CURRENT目录中的文件,而不匹配子目录中的文件

  10. 10

    如何在单个目录中查找子目录中的文件并按文件名对它们进行排序?

  11. 11

    创建子目录并根据文件名中的日期按日期组织文件

  12. 12

    更改父目录和子目录中的文件名

  13. 13

    如何仅列出删除目录和子目录的文件名

  14. 14

    如何从所有子目录中获取特定的文件名?

  15. 15

    “查找”或“ grep”文件名以匹配目录和子目录中的模式

  16. 16

    查找与文件名匹配的子目录

  17. 17

    将所有文件移动到文件名开头的子目录中

  18. 18

    如何打开与子目录中的模式匹配的文件

  19. 19

    匹配子目录

  20. 20

    尝试解压缩子目录中的文件时出现错误:警告:文件名不匹配

  21. 21

    将所有文件移动到以部分文件名命名的子目录中

  22. 22

    制作脚本以基于文件名创建子目录并将匹配的文件移入其中

  23. 23

    在Linux中将子目录中的文件名写入CSV文件

  24. 24

    将递增值写入子目录中与文件名匹配的所有文件

  25. 25

    Python-为什么fnmatch匹配子目录中的文件?

  26. 26

    列出FTP目录及其子目录中的文件名

  27. 27

    如何更改子目录中的文件名

  28. 28

    如何在忽略文件名中的空格的同时遍历子目录并执行操作

  29. 29

    ZSH 和 globstar 匹配子目录中的所有文件,但不匹配目录

热门标签

归档