仅查找包含与该文件夹同名的文件的那些文件夹

豪猪

我想找到所有子文件夹,其中包含具有相同名称(和扩展名.md的markdown文件

例如:我想查找以下子文件夹:

Apple/Banana/Orange      #Apple/Banana/Orange/Orange.md exists
Apple/Banana             #Apple/Banana/Banana.md exists
Apple/Banana/Papaya      #Apple/Banana/Papaya/Papaya.md exists
  • 注意:目录中可以有其他文件或子目录。

有什么建议?


可以使用以下代码测试问题的解决方案:

#!/usr/bin/env bash
# - goal: "Test"
# - author: Nikhil Agarwal
# - date: Wednesday, August 07, 2019
# - status: P T' (P: Prototyping, T: Tested)
# - usage: ./Test.sh
# - include:
#   1.
# - refer:
#   1. [directory - Find only those folders that contain a File with the same name as the Folder - Unix & Linux Stack Exchange](https://unix.stackexchange.com/questions/534190/find-only-those-folders-that-contain-a-file-with-the-same-name-as-the-folder)
# - formatting:
#   shellcheck disable=
#clear

main() {
    TestData
    ExpectedOutput
    TestFunction "${1:?"Please enter a test number, as the first argument, to be executed!"}"
}

TestFunction() {
    echo "Test Function"
    echo "============="
    "Test${1}"
    echo ""
}

Test1() {
    echo "Description: Thor"
    find . -type f -regextype egrep -regex '.*/([^/]+)/\1\.md$' | sort
    echo "Observation: ${Green:=}Pass, but shows filepath instead of directory path${Normal:=}"
}

Test2() {
    echo "Description: Kusalananda1"
    find . -type d -exec sh -c '
    dirpath=$1
    set -- "$dirpath"/*.md
    [ -f "$dirpath/${dirpath##*/}.md" ] && [ "$#" -eq 1 ]' sh {} \; -print | sort
    echo "Observation: ${Red:=}Fails as it ignores B.md${Normal:=}"
}

Test3() {
    echo "Description: Kusalananda2"
    find . -type d -exec sh -c '
    for dirpath do
        set -- "$dirpath"/*.md
        if [ -f "$dirpath/${dirpath##*/}.md" ] && [ "$#" -eq 1 ]
        then
            printf "%s\n" "$dirpath"
        fi
    done' sh {} + | sort
    echo "Observation: ${Red:=}Fails as it ignores B.md${Normal:=}"
}

Test4() {
    echo "Description: steeldriver1"
    find . -type d -exec sh -c '[ -f "$1/${1##*/}.md" ]' find-sh {} \; -print | sort
    echo "Observation: ${Green:=}Pass${Normal:=}"
}

Test5() {
    echo "Description: steeldriver2"
    find . -type d -exec sh -c '
  for d do
    [ -f "$d/${d##*/}.md" ] && printf "%s\n" "$d"
  done' find-sh {} + | sort
    echo "Observation: ${Green:=}Pass${Normal:=}"
}

Test6() {
    echo "Description: Stéphane Chazelas"
    find . -name '*.md' -print0 \
        | gawk -v RS='\0' -F/ -v OFS=/ '
    {filename = $NF; NF--
     if ($(NF)".md" == filename) include[$0]
     else exclude[$0]
    }
    END {for (i in include) if (!(i in exclude)) print i}'
    echo "Observation: ${Red:=}Fails as it ignores B.md${Normal:=}"
}

Test7() {
    echo "Description: Zach"
    #shellcheck disable=2044
    for fd in $(find . -type d); do
        dir=${fd##*/}
        if [ -f "${fd}/${dir}.md" ]; then
            ls "${fd}/${dir}.md"
        fi
    done
    echo "Observation: ${Green:=}Pass but shows filepath instead of directory${Normal:=}"
}
ExpectedOutput() {
    echo "Expected Output"
    echo "==============="
    cat << EOT
./GeneratedTest/A
./GeneratedTest/A/AA
./GeneratedTest/B
./GeneratedTest/C/CC1
./GeneratedTest/C/CC2
EOT
}

TestData() {
    rm -rf GeneratedTest

    mkdir -p GeneratedTest/A/AA
    touch GeneratedTest/index.md
    touch GeneratedTest/A/A.md
    touch GeneratedTest/A/AA/AA.md

    mkdir -p GeneratedTest/B
    touch GeneratedTest/B/B.md
    touch GeneratedTest/B/index.md

    mkdir -p GeneratedTest/C/CC1
    touch GeneratedTest/C/index.md
    touch GeneratedTest/C/CC1/CC1.md

    mkdir -p GeneratedTest/C/CC2
    touch GeneratedTest/C/CC2/CC2.md

    mkdir -p GeneratedTest/C/CC3
    touch GeneratedTest/C/CC3/CC.md

    mkdir -p GeneratedTest/C/CC4
}
main "$@"
雷神

假设您的文件被合理命名,即不需要-print0等。您可以使用GNU查找,如下所示:

find . -type f -regextype egrep -regex '.*/([^/]+)/\1\.md$'

输出:

./Apple/Banana/Orange/Orange.md
./Apple/Banana/Papaya/Papaya.md
./Apple/Banana/Banana.md

如果只需要目录名称,请添加一个-printf参数:

find . -type f -regextype egrep -regex '.*/([^/]+)/\1\.md$' -printf '%h\n'

在更新的测试数据上运行时的输出:

GeneratedTest/A/AA
GeneratedTest/A
GeneratedTest/C/CC2
GeneratedTest/C/CC1
GeneratedTest/B

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

查找仅包含重复文件的子文件夹

来自分类Dev

查找包含文件的文件夹 (VBA)

来自分类Dev

查找和删除仅包含最新子文件夹的子文件夹

来自分类Dev

如何在仅包含文件夹的Linux系统上递归查找文件夹?

来自分类Dev

tar仅文件中列出的那些文件夹

来自分类Dev

arrayList <File>到包含那些文件java的文件夹

来自分类Dev

linux cd到包含该文件的文件夹

来自分类Dev

查找包含图像的子文件夹

来自分类Dev

在不同文件夹中查找同名文件

来自分类Dev

在Windows 10中仅针对该文件夹保存文件夹排序

来自分类Dev

显示仅包含某些文件类型的文件的文件夹

来自分类Dev

通过Unix命令在父目录下创建一个.zip文件,该文件仅包含父文件夹及其子文件夹

来自分类Dev

Windows CMD或BATCH文件“标记”空文件夹(和仅包含空文件夹的文件夹)

来自分类Dev

循环浏览包含子文件夹的文件夹以查找excel文件

来自分类Dev

查找Dropbox文件夹

来自分类Dev

仅复制包含文件的文件夹的命令

来自分类Dev

查找包含可执行文件的文件夹

来自分类Dev

查找包含3个文本项的文件/文件夹

来自分类Dev

条件语句:查找不包含特定文件的文件夹

来自分类Dev

在包含文件的文件夹中查找关键字

来自分类Dev

查找包含特定文件的最新文件夹

来自分类Dev

用于查找包含文件的文件夹的脚本

来自分类Dev

查找包含3个文本项的文件/文件夹

来自分类Dev

尝试查找仅包含一个文件的文件夹

来自分类Dev

创建同名文件夹的zip

来自分类Dev

创建同名文件夹的zip

来自分类Dev

如何清除仅包含三个点的文件夹(指向其父文件夹)

来自分类Dev

列出仅包含名为Attic的子文件夹的文件夹

来自分类Dev

共享的Windows文件夹仅包含前15个子文件夹

Related 相关文章

  1. 1

    查找仅包含重复文件的子文件夹

  2. 2

    查找包含文件的文件夹 (VBA)

  3. 3

    查找和删除仅包含最新子文件夹的子文件夹

  4. 4

    如何在仅包含文件夹的Linux系统上递归查找文件夹?

  5. 5

    tar仅文件中列出的那些文件夹

  6. 6

    arrayList <File>到包含那些文件java的文件夹

  7. 7

    linux cd到包含该文件的文件夹

  8. 8

    查找包含图像的子文件夹

  9. 9

    在不同文件夹中查找同名文件

  10. 10

    在Windows 10中仅针对该文件夹保存文件夹排序

  11. 11

    显示仅包含某些文件类型的文件的文件夹

  12. 12

    通过Unix命令在父目录下创建一个.zip文件,该文件仅包含父文件夹及其子文件夹

  13. 13

    Windows CMD或BATCH文件“标记”空文件夹(和仅包含空文件夹的文件夹)

  14. 14

    循环浏览包含子文件夹的文件夹以查找excel文件

  15. 15

    查找Dropbox文件夹

  16. 16

    仅复制包含文件的文件夹的命令

  17. 17

    查找包含可执行文件的文件夹

  18. 18

    查找包含3个文本项的文件/文件夹

  19. 19

    条件语句:查找不包含特定文件的文件夹

  20. 20

    在包含文件的文件夹中查找关键字

  21. 21

    查找包含特定文件的最新文件夹

  22. 22

    用于查找包含文件的文件夹的脚本

  23. 23

    查找包含3个文本项的文件/文件夹

  24. 24

    尝试查找仅包含一个文件的文件夹

  25. 25

    创建同名文件夹的zip

  26. 26

    创建同名文件夹的zip

  27. 27

    如何清除仅包含三个点的文件夹(指向其父文件夹)

  28. 28

    列出仅包含名为Attic的子文件夹的文件夹

  29. 29

    共享的Windows文件夹仅包含前15个子文件夹

热门标签

归档