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

卡波

我目前正在阅读《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

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

来自分类Dev

匹配子目录

来自分类Dev

匹配子目录

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

Related 相关文章

  1. 1

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

  2. 2

    匹配子目录

  3. 3

    匹配子目录

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

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

  19. 19

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

  20. 20

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

  21. 21

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

  22. 22

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

  23. 23

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

  24. 24

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

  25. 25

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

  26. 26

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

  27. 27

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

  28. 28

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

  29. 29

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

热门标签

归档