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

Should I take out a personal loan to pay off credit card debt?

What is the probability of a biased coin coming up heads given that a liar is claiming that the coin came up heads?

What does the ISO setting for mechanical 35mm film cameras actually do?

Definitional equality of two propositions about propositional equality

How can I perform a deterministic physics simulation?

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

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

What is it exactly about flying a Flyboard across the English channel that made Zapata's thighs burn?

Does a 4 bladed prop have almost twice the thrust of a 2 bladed prop?

The Game of the Century - why didn't Byrne take the rook after he forked Fischer?

Getting an entry level IT position later in life

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

Is it double speak?

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

Whats the difference between <processors> and <pipelines> in Sitecore configuration?

How easy is it to get a gun illegally in the United States?

Write The Shortest Program To Check If A Binary Tree Is Balanced

Identify Batman without getting caught

Repeated! Factorials!

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

London underground zone 1-2 train ticket

Tile the chessboard with four-colored triominoes

How to call made-up data?

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



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
    6 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
    6 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 6 hours ago







Nikhil

















asked 8 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
    6 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
    6 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
6 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
6 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
      8 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
      6 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
      6 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
      4 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.
      6 hours ago











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

      – Kusalananda
      5 hours ago












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

      – Jim L.
      5 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
        8 hours ago












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

        – Kusalananda
        8 hours ago











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

        – Zach Sanchez
        8 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 8 hours ago

























          answered 8 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
                8 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
                6 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
                6 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
                4 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
                8 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
                6 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
                6 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
                4 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 8 hours ago

























              answered 8 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
                8 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
                6 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
                6 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
                4 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
                8 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
                6 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
                6 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
                4 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
              8 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
              8 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
              6 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
              6 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
              6 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
              6 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
              4 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
              4 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.
                6 hours ago











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

                – Kusalananda
                5 hours ago












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

                – Jim L.
                5 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.
                6 hours ago











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

                – Kusalananda
                5 hours ago












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

                – Jim L.
                5 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 7 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.
                6 hours ago











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

                – Kusalananda
                5 hours ago












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

                – Jim L.
                5 hours ago


















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

                – Jim L.
                6 hours ago











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

                – Kusalananda
                5 hours ago












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

                – Jim L.
                5 hours ago

















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

              – Jim L.
              6 hours ago





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

              – Jim L.
              6 hours ago













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

              – Kusalananda
              5 hours ago






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

              – Kusalananda
              5 hours ago














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

              – Jim L.
              5 hours ago






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

              – Jim L.
              5 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 8 hours ago

























                  answered 8 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
                        8 hours ago












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

                        – Kusalananda
                        8 hours ago











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

                        – Zach Sanchez
                        8 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
                        8 hours ago












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

                        – Kusalananda
                        8 hours ago











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

                        – Zach Sanchez
                        8 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 8 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 8 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
                        8 hours ago












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

                        – Kusalananda
                        8 hours ago











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

                        – Zach Sanchez
                        8 hours ago

















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

                        – Zach Sanchez
                        8 hours ago












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

                        – Kusalananda
                        8 hours ago











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

                        – Zach Sanchez
                        8 hours ago
















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

                      – Zach Sanchez
                      8 hours ago






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

                      – Zach Sanchez
                      8 hours ago














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

                      – Kusalananda
                      8 hours ago





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

                      – Kusalananda
                      8 hours ago













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

                      – Zach Sanchez
                      8 hours ago





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

                      – Zach Sanchez
                      8 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

                      19. јануар Садржај Догађаји Рођења Смрти Празници и дани сећања Види још Референце Мени за навигацијуу

                      Israel Cuprins Etimologie | Istorie | Geografie | Politică | Demografie | Educație | Economie | Cultură | Note explicative | Note bibliografice | Bibliografie | Legături externe | Meniu de navigaresite web oficialfacebooktweeterGoogle+Instagramcanal YouTubeInstagramtextmodificaremodificarewww.technion.ac.ilnew.huji.ac.ilwww.weizmann.ac.ilwww1.biu.ac.ilenglish.tau.ac.ilwww.haifa.ac.ilin.bgu.ac.ilwww.openu.ac.ilwww.ariel.ac.ilCIA FactbookHarta Israelului"Negotiating Jerusalem," Palestine–Israel JournalThe Schizoid Nature of Modern Hebrew: A Slavic Language in Search of a Semitic Past„Arabic in Israel: an official language and a cultural bridge”„Latest Population Statistics for Israel”„Israel Population”„Tables”„Report for Selected Countries and Subjects”Human Development Report 2016: Human Development for Everyone„Distribution of family income - Gini index”The World FactbookJerusalem Law„Israel”„Israel”„Zionist Leaders: David Ben-Gurion 1886–1973”„The status of Jerusalem”„Analysis: Kadima's big plans”„Israel's Hard-Learned Lessons”„The Legacy of Undefined Borders, Tel Aviv Notes No. 40, 5 iunie 2002”„Israel Journal: A Land Without Borders”„Population”„Israel closes decade with population of 7.5 million”Time Series-DataBank„Selected Statistics on Jerusalem Day 2007 (Hebrew)”Golan belongs to Syria, Druze protestGlobal Survey 2006: Middle East Progress Amid Global Gains in FreedomWHO: Life expectancy in Israel among highest in the worldInternational Monetary Fund, World Economic Outlook Database, April 2011: Nominal GDP list of countries. Data for the year 2010.„Israel's accession to the OECD”Popular Opinion„On the Move”Hosea 12:5„Walking the Bible Timeline”„Palestine: History”„Return to Zion”An invention called 'the Jewish people' – Haaretz – Israel NewsoriginalJewish and Non-Jewish Population of Palestine-Israel (1517–2004)ImmigrationJewishvirtuallibrary.orgChapter One: The Heralders of Zionism„The birth of modern Israel: A scrap of paper that changed history”„League of Nations: The Mandate for Palestine, 24 iulie 1922”The Population of Palestine Prior to 1948originalBackground Paper No. 47 (ST/DPI/SER.A/47)History: Foreign DominationTwo Hundred and Seventh Plenary Meeting„Israel (Labor Zionism)”Population, by Religion and Population GroupThe Suez CrisisAdolf EichmannJustice Ministry Reply to Amnesty International Report„The Interregnum”Israel Ministry of Foreign Affairs – The Palestinian National Covenant- July 1968Research on terrorism: trends, achievements & failuresThe Routledge Atlas of the Arab–Israeli conflict: The Complete History of the Struggle and the Efforts to Resolve It"George Habash, Palestinian Terrorism Tactician, Dies at 82."„1973: Arab states attack Israeli forces”Agranat Commission„Has Israel Annexed East Jerusalem?”original„After 4 Years, Intifada Still Smolders”From the End of the Cold War to 2001originalThe Oslo Accords, 1993Israel-PLO Recognition – Exchange of Letters between PM Rabin and Chairman Arafat – Sept 9- 1993Foundation for Middle East PeaceSources of Population Growth: Total Israeli Population and Settler Population, 1991–2003original„Israel marks Rabin assassination”The Wye River Memorandumoriginal„West Bank barrier route disputed, Israeli missile kills 2”"Permanent Ceasefire to Be Based on Creation Of Buffer Zone Free of Armed Personnel Other than UN, Lebanese Forces"„Hezbollah kills 8 soldiers, kidnaps two in offensive on northern border”„Olmert confirms peace talks with Syria”„Battleground Gaza: Israeli ground forces invade the strip”„IDF begins Gaza troop withdrawal, hours after ending 3-week offensive”„THE LAND: Geography and Climate”„Area of districts, sub-districts, natural regions and lakes”„Israel - Geography”„Makhteshim Country”Israel and the Palestinian Territories„Makhtesh Ramon”„The Living Dead Sea”„Temperatures reach record high in Pakistan”„Climate Extremes In Israel”Israel in figures„Deuteronom”„JNF: 240 million trees planted since 1901”„Vegetation of Israel and Neighboring Countries”Environmental Law in Israel„Executive branch”„Israel's election process explained”„The Electoral System in Israel”„Constitution for Israel”„All 120 incoming Knesset members”„Statul ISRAEL”„The Judiciary: The Court System”„Israel's high court unique in region”„Israel and the International Criminal Court: A Legal Battlefield”„Localities and population, by population group, district, sub-district and natural region”„Israel: Districts, Major Cities, Urban Localities & Metropolitan Areas”„Israel-Egypt Relations: Background & Overview of Peace Treaty”„Solana to Haaretz: New Rules of War Needed for Age of Terror”„Israel's Announcement Regarding Settlements”„United Nations Security Council Resolution 497”„Security Council resolution 478 (1980) on the status of Jerusalem”„Arabs will ask U.N. to seek razing of Israeli wall”„Olmert: Willing to trade land for peace”„Mapping Peace between Syria and Israel”„Egypt: Israel must accept the land-for-peace formula”„Israel: Age structure from 2005 to 2015”„Global, regional, and national disability-adjusted life years (DALYs) for 306 diseases and injuries and healthy life expectancy (HALE) for 188 countries, 1990–2013: quantifying the epidemiological transition”10.1016/S0140-6736(15)61340-X„World Health Statistics 2014”„Life expectancy for Israeli men world's 4th highest”„Family Structure and Well-Being Across Israel's Diverse Population”„Fertility among Jewish and Muslim Women in Israel, by Level of Religiosity, 1979-2009”„Israel leaders in birth rate, but poverty major challenge”„Ethnic Groups”„Israel's population: Over 8.5 million”„Israel - Ethnic groups”„Jews, by country of origin and age”„Minority Communities in Israel: Background & Overview”„Israel”„Language in Israel”„Selected Data from the 2011 Social Survey on Mastery of the Hebrew Language and Usage of Languages”„Religions”„5 facts about Israeli Druze, a unique religious and ethnic group”„Israël”Israel Country Study Guide„Haredi city in Negev – blessing or curse?”„New town Harish harbors hopes of being more than another Pleasantville”„List of localities, in alphabetical order”„Muncitorii români, doriți în Israel”„Prietenia româno-israeliană la nevoie se cunoaște”„The Higher Education System in Israel”„Middle East”„Academic Ranking of World Universities 2016”„Israel”„Israel”„Jewish Nobel Prize Winners”„All Nobel Prizes in Literature”„All Nobel Peace Prizes”„All Prizes in Economic Sciences”„All Nobel Prizes in Chemistry”„List of Fields Medallists”„Sakharov Prize”„Țara care și-a sfidat "destinul" și se bate umăr la umăr cu Silicon Valley”„Apple's R&D center in Israel grew to about 800 employees”„Tim Cook: Apple's Herzliya R&D center second-largest in world”„Lecții de economie de la Israel”„Land use”Israel Investment and Business GuideA Country Study: IsraelCentral Bureau of StatisticsFlorin Diaconu, „Kadima: Flexibilitate și pragmatism, dar nici un compromis în chestiuni vitale", în Revista Institutului Diplomatic Român, anul I, numărul I, semestrul I, 2006, pp. 71-72Florin Diaconu, „Likud: Dreapta israeliană constant opusă retrocedării teritoriilor cureite prin luptă în 1967", în Revista Institutului Diplomatic Român, anul I, numărul I, semestrul I, 2006, pp. 73-74MassadaIsraelul a crescut in 50 de ani cât alte state intr-un mileniuIsrael Government PortalIsraelIsraelIsraelmmmmmXX451232cb118646298(data)4027808-634110000 0004 0372 0767n7900328503691455-bb46-37e3-91d2-cb064a35ffcc1003570400564274ge1294033523775214929302638955X146498911146498911

                      Кастелфранко ди Сопра Становништво Референце Спољашње везе Мени за навигацију43°37′18″ СГШ; 11°33′32″ ИГД / 43.62156° СГШ; 11.55885° ИГД / 43.62156; 11.5588543°37′18″ СГШ; 11°33′32″ ИГД / 43.62156° СГШ; 11.55885° ИГД / 43.62156; 11.558853179688„The GeoNames geographical database”„Istituto Nazionale di Statistica”проширитиууWorldCat156923403n850174324558639-1cb14643287r(подаци)