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

                      ParseJSON using SSJSUsing AMPscript with SSJS ActivitiesHow to resubscribe a user in Marketing cloud using SSJS?Pulling Subscriber Status from Lists using SSJSRetrieving Emails using SSJSProblem in updating DE using SSJSUsing SSJS to send single email in Marketing CloudError adding EmailSendDefinition using SSJS

                      Кампала Садржај Географија Географија Историја Становништво Привреда Партнерски градови Референце Спољашње везе Мени за навигацију0°11′ СГШ; 32°20′ ИГД / 0.18° СГШ; 32.34° ИГД / 0.18; 32.340°11′ СГШ; 32°20′ ИГД / 0.18° СГШ; 32.34° ИГД / 0.18; 32.34МедијиПодациЗванични веб-сајту

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