Find only those folders that contain a File with the same name as the FolderUnderstanding the -exec option of `find`Why can't I have a folder and a file with the same name?Find directories that do not contain subdirectoriesHow to find file/directory names that are the same, but with different capitalization/case?Merging folders with practically the same name but different casingFind all tar.gz files and move them to a one level down directoryConditional statements: finding folders that don't contain a particular filefind xml file that contain specific tag name and print the words between tag nameFind all files with the same nameUnzip to a folder with the same nameFind directories that do not contain a file in only directories proceeding a specific directory

Identify Batman without getting caught

Our group keeps dying during the Lost Mine of Phandelver campaign. What are we doing wrong?

I was contacted by a private bank overseas to get my inheritance

Ubuntu show wrong disk sizes, how to solve it?

Why do dragons like shiny stuff?

New workplace asking for bank pin and account number

The meaning of "scale" in "because diversions scale so easily wealth becomes concentrated"

How to approach protecting my code as a research assistant? Should I be worried in the first place?

Is the first page of a novel really that important?

Based on what criteria do you add/not add icons to labels within a toolbar?

How does LIDAR avoid getting confused in an environment being scanned by hundreds of other LIDAR?

How to make attic easier to traverse?

Does the length of a password for Wi-Fi affect speed?

I am considering a visit to a Nevada brothel. What should I say at the US border?

If someone else uploads my GPL'd code to Github without my permission, is that a copyright violation?

split large formula in align

Does a humanoid possessed by a ghost register as undead to a paladin's Divine Sense?

Why does putting a dot after the URL remove login information?

Not been paid even after reminding the Treasurer; what should I do?

How do I get the =LEFT function in excel, to also take the number zero as the first number?

Plato and the knowledge of the forms

Find a text string in a file and output only the rest of the text that follows it?

Did Captain America make out with his niece?

What is an air conditioner compressor hard start kit and how does it work?



Find only those folders that contain a File with the same name as the Folder


Understanding the -exec option of `find`Why can't I have a folder and a file with the same name?Find directories that do not contain subdirectoriesHow to find file/directory names that are the same, but with different capitalization/case?Merging folders with practically the same name but different casingFind all tar.gz files and move them to a one level down directoryConditional statements: finding folders that don't contain a particular filefind xml file that contain specific tag name and print the words between tag nameFind all files with the same nameUnzip to a folder with the same nameFind directories that do not contain a file in only directories proceeding a specific directory






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








2















I want to find all subfolders, that contains a markdown file with the same name (and extension .md).



For example: I want to Find following subfolders:



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



  • Note



    • Folders that contain markdown file whose names are different should not be found.

    • There can be other files or subdirectory in the directory.


Any suggestions?




Final Remarks



All 5 below answer are working correctly: To those who are upvoting any particular answer, could you please specify what you found better than the rest of the answers? It would help me to choose the most suitable answer.










share|improve this question





















  • 1





    Regarding your final remarks. Note that some answers do different things from others. Mine and Stéphane's for example, interpreted your first "Note" as "if there are other markdown files in the directory whatsoever, don't return that directory" while the others don't (as far as I can see). Apart from that, only you can pick the answer that is most helpful to you. Answers here will continue to receive up and down votes after you have accepted an answer, depending on what other readers find most useful.

    – Kusalananda
    9 hours ago


















2















I want to find all subfolders, that contains a markdown file with the same name (and extension .md).



For example: I want to Find following subfolders:



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



  • Note



    • Folders that contain markdown file whose names are different should not be found.

    • There can be other files or subdirectory in the directory.


Any suggestions?




Final Remarks



All 5 below answer are working correctly: To those who are upvoting any particular answer, could you please specify what you found better than the rest of the answers? It would help me to choose the most suitable answer.










share|improve this question





















  • 1





    Regarding your final remarks. Note that some answers do different things from others. Mine and Stéphane's for example, interpreted your first "Note" as "if there are other markdown files in the directory whatsoever, don't return that directory" while the others don't (as far as I can see). Apart from that, only you can pick the answer that is most helpful to you. Answers here will continue to receive up and down votes after you have accepted an answer, depending on what other readers find most useful.

    – Kusalananda
    9 hours ago














2












2








2








I want to find all subfolders, that contains a markdown file with the same name (and extension .md).



For example: I want to Find following subfolders:



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



  • Note



    • Folders that contain markdown file whose names are different should not be found.

    • There can be other files or subdirectory in the directory.


Any suggestions?




Final Remarks



All 5 below answer are working correctly: To those who are upvoting any particular answer, could you please specify what you found better than the rest of the answers? It would help me to choose the most suitable answer.










share|improve this question
















I want to find all subfolders, that contains a markdown file with the same name (and extension .md).



For example: I want to Find following subfolders:



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



  • Note



    • Folders that contain markdown file whose names are different should not be found.

    • There can be other files or subdirectory in the directory.


Any suggestions?




Final Remarks



All 5 below answer are working correctly: To those who are upvoting any particular answer, could you please specify what you found better than the rest of the answers? It would help me to choose the most suitable answer.







find directory filenames gnu






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 9 hours ago







Nikhil

















asked 11 hours ago









NikhilNikhil

3963 silver badges16 bronze badges




3963 silver badges16 bronze badges










  • 1





    Regarding your final remarks. Note that some answers do different things from others. Mine and Stéphane's for example, interpreted your first "Note" as "if there are other markdown files in the directory whatsoever, don't return that directory" while the others don't (as far as I can see). Apart from that, only you can pick the answer that is most helpful to you. Answers here will continue to receive up and down votes after you have accepted an answer, depending on what other readers find most useful.

    – Kusalananda
    9 hours ago













  • 1





    Regarding your final remarks. Note that some answers do different things from others. Mine and Stéphane's for example, interpreted your first "Note" as "if there are other markdown files in the directory whatsoever, don't return that directory" while the others don't (as far as I can see). Apart from that, only you can pick the answer that is most helpful to you. Answers here will continue to receive up and down votes after you have accepted an answer, depending on what other readers find most useful.

    – Kusalananda
    9 hours ago








1




1





Regarding your final remarks. Note that some answers do different things from others. Mine and Stéphane's for example, interpreted your first "Note" as "if there are other markdown files in the directory whatsoever, don't return that directory" while the others don't (as far as I can see). Apart from that, only you can pick the answer that is most helpful to you. Answers here will continue to receive up and down votes after you have accepted an answer, depending on what other readers find most useful.

– Kusalananda
9 hours ago






Regarding your final remarks. Note that some answers do different things from others. Mine and Stéphane's for example, interpreted your first "Note" as "if there are other markdown files in the directory whatsoever, don't return that directory" while the others don't (as far as I can see). Apart from that, only you can pick the answer that is most helpful to you. Answers here will continue to receive up and down votes after you have accepted an answer, depending on what other readers find most useful.

– Kusalananda
9 hours ago











5 Answers
5






active

oldest

votes


















1














find . -type d -exec sh -c '
dirpath=$1
set -- "$dirpath"/*.md
[ -f "$dirpath/$dirpath##*/.md" ] && [ "$#" -eq 1 ]' sh ; -print


The above would find all directories below the current directory (including the current directory) and would execute a short shell script for each.



The shell code would test whether there's a markdown file with the same name as the directory inside the directory, and whether this is the only *.md name in that directory. If such a file exists and if it's the only *.md name, the inline shell script exits with a zero exit status. Otherwise it exits with a non-zero exit status (signalling failure).



The set -- "$dirpath"/*.md bit will set the positional parameters to the list of pathnames matching the pattern (matches any name with a suffix .md in the directory). We can then use $# later to see how many matches we got from this.



If the shell script exits successfully, -print will print the path to the found directory.



Slightly speedier version that uses fewer invocations of the inline script, but that doesn't let you do more with the found pathnames in find itself (the inline script may be further expanded though):



find . -type d -exec sh -c '
for dirpath do
set -- "$dirpath"/*.md
if [ -f "$dirpath/$dirpath##*/.md" ] && [ "$#" -eq 1 ]
then
printf "%sn" "$dirpath"
fi
done' sh +


See also:



  • Understanding the -exec option of `find`





share|improve this answer


































    3














    On a GNU system, you could do something like:



    find . -name '*.md' -print0 |
    gawk -v RS='' -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'





    share|improve this answer






















    • 2





      would you mind re-including your proposed zsh solution as an alternate? it would be helpful for those of us trying to learn more about zsh

      – steeldriver
      10 hours ago











    • Given that this answer has received more votes: To those who are upvoting this answer, could you please specify why this is better than the rest? It would help me to choose the most suitable answer.

      – Nikhil
      9 hours ago












    • Stéphane, I agree with steeldriver. Do mention the previous zsh solution (it got, I believe, two of the upvotes), and feel free to point out any flaws in it that might have prompted you to remove it.

      – Kusalananda
      9 hours ago











    • @steeldriver, in that zsh approach I (like you) had missed the part of the requirement that dirs that contain other md files should be omitted.

      – Stéphane Chazelas
      7 hours ago


















    2














    Assuming your files are sensibly named, i.e. no need for -print0 etc. You can do this with GNU find like this:



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


    Output:



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





    share|improve this answer

























    • Even without GNU find: find . -type f | egrep '.*/([^/]+)/1.md$'

      – Jim L.
      9 hours ago











    • @JimL. Except that piping it to a line-oriented tool would break on some characters in filenames, like newline.

      – Kusalananda
      8 hours ago












    • @Kusalananda Agreed, however, this particular answer is predicated on "sensibly named" files that don't require print0.

      – Jim L.
      8 hours ago



















    1














    Either



    find . -type d -exec sh -c '[ -f "$1/$1##*/.md" ]' find-sh ; -print


    or



    find . -type d -exec sh -c '
    for d do
    [ -f "$d/$d##*/.md" ] && printf "%sn" "$d"
    done' find-sh +


    To avoid running one sh per file.



    The find-sh is an arbitrary string that becomes the shell's zeroth positional parameter $0 - making it something memorable may help with debugging in case the shell encounters errors (others may suggest using plain sh or even _ as a default "skip" parameter).






    share|improve this answer


































      0














      This would require a bit of logic.



      for fd in `find . -type d`; do
      dir=$fd##*/
      if [ -f $fd/$dir.md ]; then
      ls $fd/$dir.md
      fi
      done


      You can also adapt that to fit into a one liner by using code blocks.



      EDIT: Bash is hard. basedir is not a command, dirname doesn't do what I thought it did, so let's go with parameter expansion.






      share|improve this answer










      New contributor



      Zach Sanchez is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





















      • That would be because I apparently can't remember bash commands or how they work.

        – Zach Sanchez
        11 hours ago












      • dirname is the command you're looking for, and assignments can't have spaces around the =.

        – Kusalananda
        11 hours ago











      • Found that out pretty quickly after it was pointed out, and the spaces were a typo.

        – Zach Sanchez
        11 hours ago













      Your Answer








      StackExchange.ready(function()
      var channelOptions =
      tags: "".split(" "),
      id: "106"
      ;
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function()
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled)
      StackExchange.using("snippets", function()
      createEditor();
      );

      else
      createEditor();

      );

      function createEditor()
      StackExchange.prepareEditor(
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: false,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: null,
      bindNavPrevention: true,
      postfix: "",
      imageUploader:
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      ,
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      );



      );













      draft saved

      draft discarded


















      StackExchange.ready(
      function ()
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f534190%2ffind-only-those-folders-that-contain-a-file-with-the-same-name-as-the-folder%23new-answer', 'question_page');

      );

      Post as a guest















      Required, but never shown

























      5 Answers
      5






      active

      oldest

      votes








      5 Answers
      5






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      1














      find . -type d -exec sh -c '
      dirpath=$1
      set -- "$dirpath"/*.md
      [ -f "$dirpath/$dirpath##*/.md" ] && [ "$#" -eq 1 ]' sh ; -print


      The above would find all directories below the current directory (including the current directory) and would execute a short shell script for each.



      The shell code would test whether there's a markdown file with the same name as the directory inside the directory, and whether this is the only *.md name in that directory. If such a file exists and if it's the only *.md name, the inline shell script exits with a zero exit status. Otherwise it exits with a non-zero exit status (signalling failure).



      The set -- "$dirpath"/*.md bit will set the positional parameters to the list of pathnames matching the pattern (matches any name with a suffix .md in the directory). We can then use $# later to see how many matches we got from this.



      If the shell script exits successfully, -print will print the path to the found directory.



      Slightly speedier version that uses fewer invocations of the inline script, but that doesn't let you do more with the found pathnames in find itself (the inline script may be further expanded though):



      find . -type d -exec sh -c '
      for dirpath do
      set -- "$dirpath"/*.md
      if [ -f "$dirpath/$dirpath##*/.md" ] && [ "$#" -eq 1 ]
      then
      printf "%sn" "$dirpath"
      fi
      done' sh +


      See also:



      • Understanding the -exec option of `find`





      share|improve this answer































        1














        find . -type d -exec sh -c '
        dirpath=$1
        set -- "$dirpath"/*.md
        [ -f "$dirpath/$dirpath##*/.md" ] && [ "$#" -eq 1 ]' sh ; -print


        The above would find all directories below the current directory (including the current directory) and would execute a short shell script for each.



        The shell code would test whether there's a markdown file with the same name as the directory inside the directory, and whether this is the only *.md name in that directory. If such a file exists and if it's the only *.md name, the inline shell script exits with a zero exit status. Otherwise it exits with a non-zero exit status (signalling failure).



        The set -- "$dirpath"/*.md bit will set the positional parameters to the list of pathnames matching the pattern (matches any name with a suffix .md in the directory). We can then use $# later to see how many matches we got from this.



        If the shell script exits successfully, -print will print the path to the found directory.



        Slightly speedier version that uses fewer invocations of the inline script, but that doesn't let you do more with the found pathnames in find itself (the inline script may be further expanded though):



        find . -type d -exec sh -c '
        for dirpath do
        set -- "$dirpath"/*.md
        if [ -f "$dirpath/$dirpath##*/.md" ] && [ "$#" -eq 1 ]
        then
        printf "%sn" "$dirpath"
        fi
        done' sh +


        See also:



        • Understanding the -exec option of `find`





        share|improve this answer





























          1












          1








          1







          find . -type d -exec sh -c '
          dirpath=$1
          set -- "$dirpath"/*.md
          [ -f "$dirpath/$dirpath##*/.md" ] && [ "$#" -eq 1 ]' sh ; -print


          The above would find all directories below the current directory (including the current directory) and would execute a short shell script for each.



          The shell code would test whether there's a markdown file with the same name as the directory inside the directory, and whether this is the only *.md name in that directory. If such a file exists and if it's the only *.md name, the inline shell script exits with a zero exit status. Otherwise it exits with a non-zero exit status (signalling failure).



          The set -- "$dirpath"/*.md bit will set the positional parameters to the list of pathnames matching the pattern (matches any name with a suffix .md in the directory). We can then use $# later to see how many matches we got from this.



          If the shell script exits successfully, -print will print the path to the found directory.



          Slightly speedier version that uses fewer invocations of the inline script, but that doesn't let you do more with the found pathnames in find itself (the inline script may be further expanded though):



          find . -type d -exec sh -c '
          for dirpath do
          set -- "$dirpath"/*.md
          if [ -f "$dirpath/$dirpath##*/.md" ] && [ "$#" -eq 1 ]
          then
          printf "%sn" "$dirpath"
          fi
          done' sh +


          See also:



          • Understanding the -exec option of `find`





          share|improve this answer















          find . -type d -exec sh -c '
          dirpath=$1
          set -- "$dirpath"/*.md
          [ -f "$dirpath/$dirpath##*/.md" ] && [ "$#" -eq 1 ]' sh ; -print


          The above would find all directories below the current directory (including the current directory) and would execute a short shell script for each.



          The shell code would test whether there's a markdown file with the same name as the directory inside the directory, and whether this is the only *.md name in that directory. If such a file exists and if it's the only *.md name, the inline shell script exits with a zero exit status. Otherwise it exits with a non-zero exit status (signalling failure).



          The set -- "$dirpath"/*.md bit will set the positional parameters to the list of pathnames matching the pattern (matches any name with a suffix .md in the directory). We can then use $# later to see how many matches we got from this.



          If the shell script exits successfully, -print will print the path to the found directory.



          Slightly speedier version that uses fewer invocations of the inline script, but that doesn't let you do more with the found pathnames in find itself (the inline script may be further expanded though):



          find . -type d -exec sh -c '
          for dirpath do
          set -- "$dirpath"/*.md
          if [ -f "$dirpath/$dirpath##*/.md" ] && [ "$#" -eq 1 ]
          then
          printf "%sn" "$dirpath"
          fi
          done' sh +


          See also:



          • Understanding the -exec option of `find`






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 10 hours ago

























          answered 11 hours ago









          KusalanandaKusalananda

          158k18 gold badges313 silver badges498 bronze badges




          158k18 gold badges313 silver badges498 bronze badges


























              3














              On a GNU system, you could do something like:



              find . -name '*.md' -print0 |
              gawk -v RS='' -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'





              share|improve this answer






















              • 2





                would you mind re-including your proposed zsh solution as an alternate? it would be helpful for those of us trying to learn more about zsh

                – steeldriver
                10 hours ago











              • Given that this answer has received more votes: To those who are upvoting this answer, could you please specify why this is better than the rest? It would help me to choose the most suitable answer.

                – Nikhil
                9 hours ago












              • Stéphane, I agree with steeldriver. Do mention the previous zsh solution (it got, I believe, two of the upvotes), and feel free to point out any flaws in it that might have prompted you to remove it.

                – Kusalananda
                9 hours ago











              • @steeldriver, in that zsh approach I (like you) had missed the part of the requirement that dirs that contain other md files should be omitted.

                – Stéphane Chazelas
                7 hours ago















              3














              On a GNU system, you could do something like:



              find . -name '*.md' -print0 |
              gawk -v RS='' -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'





              share|improve this answer






















              • 2





                would you mind re-including your proposed zsh solution as an alternate? it would be helpful for those of us trying to learn more about zsh

                – steeldriver
                10 hours ago











              • Given that this answer has received more votes: To those who are upvoting this answer, could you please specify why this is better than the rest? It would help me to choose the most suitable answer.

                – Nikhil
                9 hours ago












              • Stéphane, I agree with steeldriver. Do mention the previous zsh solution (it got, I believe, two of the upvotes), and feel free to point out any flaws in it that might have prompted you to remove it.

                – Kusalananda
                9 hours ago











              • @steeldriver, in that zsh approach I (like you) had missed the part of the requirement that dirs that contain other md files should be omitted.

                – Stéphane Chazelas
                7 hours ago













              3












              3








              3







              On a GNU system, you could do something like:



              find . -name '*.md' -print0 |
              gawk -v RS='' -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'





              share|improve this answer















              On a GNU system, you could do something like:



              find . -name '*.md' -print0 |
              gawk -v RS='' -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'






              share|improve this answer














              share|improve this answer



              share|improve this answer








              edited 11 hours ago

























              answered 11 hours ago









              Stéphane ChazelasStéphane Chazelas

              328k57 gold badges638 silver badges1006 bronze badges




              328k57 gold badges638 silver badges1006 bronze badges










              • 2





                would you mind re-including your proposed zsh solution as an alternate? it would be helpful for those of us trying to learn more about zsh

                – steeldriver
                10 hours ago











              • Given that this answer has received more votes: To those who are upvoting this answer, could you please specify why this is better than the rest? It would help me to choose the most suitable answer.

                – Nikhil
                9 hours ago












              • Stéphane, I agree with steeldriver. Do mention the previous zsh solution (it got, I believe, two of the upvotes), and feel free to point out any flaws in it that might have prompted you to remove it.

                – Kusalananda
                9 hours ago











              • @steeldriver, in that zsh approach I (like you) had missed the part of the requirement that dirs that contain other md files should be omitted.

                – Stéphane Chazelas
                7 hours ago












              • 2





                would you mind re-including your proposed zsh solution as an alternate? it would be helpful for those of us trying to learn more about zsh

                – steeldriver
                10 hours ago











              • Given that this answer has received more votes: To those who are upvoting this answer, could you please specify why this is better than the rest? It would help me to choose the most suitable answer.

                – Nikhil
                9 hours ago












              • Stéphane, I agree with steeldriver. Do mention the previous zsh solution (it got, I believe, two of the upvotes), and feel free to point out any flaws in it that might have prompted you to remove it.

                – Kusalananda
                9 hours ago











              • @steeldriver, in that zsh approach I (like you) had missed the part of the requirement that dirs that contain other md files should be omitted.

                – Stéphane Chazelas
                7 hours ago







              2




              2





              would you mind re-including your proposed zsh solution as an alternate? it would be helpful for those of us trying to learn more about zsh

              – steeldriver
              10 hours ago





              would you mind re-including your proposed zsh solution as an alternate? it would be helpful for those of us trying to learn more about zsh

              – steeldriver
              10 hours ago













              Given that this answer has received more votes: To those who are upvoting this answer, could you please specify why this is better than the rest? It would help me to choose the most suitable answer.

              – Nikhil
              9 hours ago






              Given that this answer has received more votes: To those who are upvoting this answer, could you please specify why this is better than the rest? It would help me to choose the most suitable answer.

              – Nikhil
              9 hours ago














              Stéphane, I agree with steeldriver. Do mention the previous zsh solution (it got, I believe, two of the upvotes), and feel free to point out any flaws in it that might have prompted you to remove it.

              – Kusalananda
              9 hours ago





              Stéphane, I agree with steeldriver. Do mention the previous zsh solution (it got, I believe, two of the upvotes), and feel free to point out any flaws in it that might have prompted you to remove it.

              – Kusalananda
              9 hours ago













              @steeldriver, in that zsh approach I (like you) had missed the part of the requirement that dirs that contain other md files should be omitted.

              – Stéphane Chazelas
              7 hours ago





              @steeldriver, in that zsh approach I (like you) had missed the part of the requirement that dirs that contain other md files should be omitted.

              – Stéphane Chazelas
              7 hours ago











              2














              Assuming your files are sensibly named, i.e. no need for -print0 etc. You can do this with GNU find like this:



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


              Output:



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





              share|improve this answer

























              • Even without GNU find: find . -type f | egrep '.*/([^/]+)/1.md$'

                – Jim L.
                9 hours ago











              • @JimL. Except that piping it to a line-oriented tool would break on some characters in filenames, like newline.

                – Kusalananda
                8 hours ago












              • @Kusalananda Agreed, however, this particular answer is predicated on "sensibly named" files that don't require print0.

                – Jim L.
                8 hours ago
















              2














              Assuming your files are sensibly named, i.e. no need for -print0 etc. You can do this with GNU find like this:



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


              Output:



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





              share|improve this answer

























              • Even without GNU find: find . -type f | egrep '.*/([^/]+)/1.md$'

                – Jim L.
                9 hours ago











              • @JimL. Except that piping it to a line-oriented tool would break on some characters in filenames, like newline.

                – Kusalananda
                8 hours ago












              • @Kusalananda Agreed, however, this particular answer is predicated on "sensibly named" files that don't require print0.

                – Jim L.
                8 hours ago














              2












              2








              2







              Assuming your files are sensibly named, i.e. no need for -print0 etc. You can do this with GNU find like this:



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


              Output:



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





              share|improve this answer













              Assuming your files are sensibly named, i.e. no need for -print0 etc. You can do this with GNU find like this:



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


              Output:



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






              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered 10 hours ago









              ThorThor

              12.6k1 gold badge40 silver badges63 bronze badges




              12.6k1 gold badge40 silver badges63 bronze badges















              • Even without GNU find: find . -type f | egrep '.*/([^/]+)/1.md$'

                – Jim L.
                9 hours ago











              • @JimL. Except that piping it to a line-oriented tool would break on some characters in filenames, like newline.

                – Kusalananda
                8 hours ago












              • @Kusalananda Agreed, however, this particular answer is predicated on "sensibly named" files that don't require print0.

                – Jim L.
                8 hours ago


















              • Even without GNU find: find . -type f | egrep '.*/([^/]+)/1.md$'

                – Jim L.
                9 hours ago











              • @JimL. Except that piping it to a line-oriented tool would break on some characters in filenames, like newline.

                – Kusalananda
                8 hours ago












              • @Kusalananda Agreed, however, this particular answer is predicated on "sensibly named" files that don't require print0.

                – Jim L.
                8 hours ago

















              Even without GNU find: find . -type f | egrep '.*/([^/]+)/1.md$'

              – Jim L.
              9 hours ago





              Even without GNU find: find . -type f | egrep '.*/([^/]+)/1.md$'

              – Jim L.
              9 hours ago













              @JimL. Except that piping it to a line-oriented tool would break on some characters in filenames, like newline.

              – Kusalananda
              8 hours ago






              @JimL. Except that piping it to a line-oriented tool would break on some characters in filenames, like newline.

              – Kusalananda
              8 hours ago














              @Kusalananda Agreed, however, this particular answer is predicated on "sensibly named" files that don't require print0.

              – Jim L.
              8 hours ago






              @Kusalananda Agreed, however, this particular answer is predicated on "sensibly named" files that don't require print0.

              – Jim L.
              8 hours ago












              1














              Either



              find . -type d -exec sh -c '[ -f "$1/$1##*/.md" ]' find-sh ; -print


              or



              find . -type d -exec sh -c '
              for d do
              [ -f "$d/$d##*/.md" ] && printf "%sn" "$d"
              done' find-sh +


              To avoid running one sh per file.



              The find-sh is an arbitrary string that becomes the shell's zeroth positional parameter $0 - making it something memorable may help with debugging in case the shell encounters errors (others may suggest using plain sh or even _ as a default "skip" parameter).






              share|improve this answer































                1














                Either



                find . -type d -exec sh -c '[ -f "$1/$1##*/.md" ]' find-sh ; -print


                or



                find . -type d -exec sh -c '
                for d do
                [ -f "$d/$d##*/.md" ] && printf "%sn" "$d"
                done' find-sh +


                To avoid running one sh per file.



                The find-sh is an arbitrary string that becomes the shell's zeroth positional parameter $0 - making it something memorable may help with debugging in case the shell encounters errors (others may suggest using plain sh or even _ as a default "skip" parameter).






                share|improve this answer





























                  1












                  1








                  1







                  Either



                  find . -type d -exec sh -c '[ -f "$1/$1##*/.md" ]' find-sh ; -print


                  or



                  find . -type d -exec sh -c '
                  for d do
                  [ -f "$d/$d##*/.md" ] && printf "%sn" "$d"
                  done' find-sh +


                  To avoid running one sh per file.



                  The find-sh is an arbitrary string that becomes the shell's zeroth positional parameter $0 - making it something memorable may help with debugging in case the shell encounters errors (others may suggest using plain sh or even _ as a default "skip" parameter).






                  share|improve this answer















                  Either



                  find . -type d -exec sh -c '[ -f "$1/$1##*/.md" ]' find-sh ; -print


                  or



                  find . -type d -exec sh -c '
                  for d do
                  [ -f "$d/$d##*/.md" ] && printf "%sn" "$d"
                  done' find-sh +


                  To avoid running one sh per file.



                  The find-sh is an arbitrary string that becomes the shell's zeroth positional parameter $0 - making it something memorable may help with debugging in case the shell encounters errors (others may suggest using plain sh or even _ as a default "skip" parameter).







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited 10 hours ago

























                  answered 11 hours ago









                  steeldriversteeldriver

                  41.8k4 gold badges56 silver badges94 bronze badges




                  41.8k4 gold badges56 silver badges94 bronze badges
























                      0














                      This would require a bit of logic.



                      for fd in `find . -type d`; do
                      dir=$fd##*/
                      if [ -f $fd/$dir.md ]; then
                      ls $fd/$dir.md
                      fi
                      done


                      You can also adapt that to fit into a one liner by using code blocks.



                      EDIT: Bash is hard. basedir is not a command, dirname doesn't do what I thought it did, so let's go with parameter expansion.






                      share|improve this answer










                      New contributor



                      Zach Sanchez is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                      Check out our Code of Conduct.





















                      • That would be because I apparently can't remember bash commands or how they work.

                        – Zach Sanchez
                        11 hours ago












                      • dirname is the command you're looking for, and assignments can't have spaces around the =.

                        – Kusalananda
                        11 hours ago











                      • Found that out pretty quickly after it was pointed out, and the spaces were a typo.

                        – Zach Sanchez
                        11 hours ago















                      0














                      This would require a bit of logic.



                      for fd in `find . -type d`; do
                      dir=$fd##*/
                      if [ -f $fd/$dir.md ]; then
                      ls $fd/$dir.md
                      fi
                      done


                      You can also adapt that to fit into a one liner by using code blocks.



                      EDIT: Bash is hard. basedir is not a command, dirname doesn't do what I thought it did, so let's go with parameter expansion.






                      share|improve this answer










                      New contributor



                      Zach Sanchez is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                      Check out our Code of Conduct.





















                      • That would be because I apparently can't remember bash commands or how they work.

                        – Zach Sanchez
                        11 hours ago












                      • dirname is the command you're looking for, and assignments can't have spaces around the =.

                        – Kusalananda
                        11 hours ago











                      • Found that out pretty quickly after it was pointed out, and the spaces were a typo.

                        – Zach Sanchez
                        11 hours ago













                      0












                      0








                      0







                      This would require a bit of logic.



                      for fd in `find . -type d`; do
                      dir=$fd##*/
                      if [ -f $fd/$dir.md ]; then
                      ls $fd/$dir.md
                      fi
                      done


                      You can also adapt that to fit into a one liner by using code blocks.



                      EDIT: Bash is hard. basedir is not a command, dirname doesn't do what I thought it did, so let's go with parameter expansion.






                      share|improve this answer










                      New contributor



                      Zach Sanchez is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                      Check out our Code of Conduct.









                      This would require a bit of logic.



                      for fd in `find . -type d`; do
                      dir=$fd##*/
                      if [ -f $fd/$dir.md ]; then
                      ls $fd/$dir.md
                      fi
                      done


                      You can also adapt that to fit into a one liner by using code blocks.



                      EDIT: Bash is hard. basedir is not a command, dirname doesn't do what I thought it did, so let's go with parameter expansion.







                      share|improve this answer










                      New contributor



                      Zach Sanchez is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                      Check out our Code of Conduct.








                      share|improve this answer



                      share|improve this answer








                      edited 11 hours ago





















                      New contributor



                      Zach Sanchez is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                      Check out our Code of Conduct.








                      answered 11 hours ago









                      Zach SanchezZach Sanchez

                      563 bronze badges




                      563 bronze badges




                      New contributor



                      Zach Sanchez is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                      Check out our Code of Conduct.




                      New contributor




                      Zach Sanchez is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                      Check out our Code of Conduct.

















                      • That would be because I apparently can't remember bash commands or how they work.

                        – Zach Sanchez
                        11 hours ago












                      • dirname is the command you're looking for, and assignments can't have spaces around the =.

                        – Kusalananda
                        11 hours ago











                      • Found that out pretty quickly after it was pointed out, and the spaces were a typo.

                        – Zach Sanchez
                        11 hours ago

















                      • That would be because I apparently can't remember bash commands or how they work.

                        – Zach Sanchez
                        11 hours ago












                      • dirname is the command you're looking for, and assignments can't have spaces around the =.

                        – Kusalananda
                        11 hours ago











                      • Found that out pretty quickly after it was pointed out, and the spaces were a typo.

                        – Zach Sanchez
                        11 hours ago
















                      That would be because I apparently can't remember bash commands or how they work.

                      – Zach Sanchez
                      11 hours ago






                      That would be because I apparently can't remember bash commands or how they work.

                      – Zach Sanchez
                      11 hours ago














                      dirname is the command you're looking for, and assignments can't have spaces around the =.

                      – Kusalananda
                      11 hours ago





                      dirname is the command you're looking for, and assignments can't have spaces around the =.

                      – Kusalananda
                      11 hours ago













                      Found that out pretty quickly after it was pointed out, and the spaces were a typo.

                      – Zach Sanchez
                      11 hours ago





                      Found that out pretty quickly after it was pointed out, and the spaces were a typo.

                      – Zach Sanchez
                      11 hours ago

















                      draft saved

                      draft discarded
















































                      Thanks for contributing an answer to Unix & Linux Stack Exchange!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid


                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.

                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function ()
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f534190%2ffind-only-those-folders-that-contain-a-file-with-the-same-name-as-the-folder%23new-answer', 'question_page');

                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Canceling a color specificationRandomly assigning color to Graphics3D objects?Default color for Filling in Mathematica 9Coloring specific elements of sets with a prime modified order in an array plotHow to pick a color differing significantly from the colors already in a given color list?Detection of the text colorColor numbers based on their valueCan color schemes for use with ColorData include opacity specification?My dynamic color schemes

                      Invision Community Contents History See also References External links Navigation menuProprietaryinvisioncommunity.comIPS Community ForumsIPS Community Forumsthis blog entry"License Changes, IP.Board 3.4, and the Future""Interview -- Matt Mecham of Ibforums""CEO Invision Power Board, Matt Mecham Is a Liar, Thief!"IPB License Explanation 1.3, 1.3.1, 2.0, and 2.1ArchivedSecurity Fixes, Updates And Enhancements For IPB 1.3.1Archived"New Demo Accounts - Invision Power Services"the original"New Default Skin"the original"Invision Power Board 3.0.0 and Applications Released"the original"Archived copy"the original"Perpetual licenses being done away with""Release Notes - Invision Power Services""Introducing: IPS Community Suite 4!"Invision Community Release Notes

                      199年 目錄 大件事 到箇年出世嗰人 到箇年死嗰人 節慶、風俗習慣 導覽選單