Find only those folders that contain a File with the same name as the FolderUnderstanding the -exec option of `find`Why can't I have a folder and a file with the same name?Find directories that do not contain subdirectoriesHow to find file/directory names that are the same, but with different capitalization/case?Merging folders with practically the same name but different casingFind all tar.gz files and move them to a one level down directoryConditional statements: finding folders that don't contain a particular filefind xml file that contain specific tag name and print the words between tag nameFind all files with the same nameUnzip to a folder with the same nameFind directories that do not contain a file in only directories proceeding a specific directory
Identify Batman without getting caught
Our group keeps dying during the Lost Mine of Phandelver campaign. What are we doing wrong?
I was contacted by a private bank overseas to get my inheritance
Ubuntu show wrong disk sizes, how to solve it?
Why do dragons like shiny stuff?
New workplace asking for bank pin and account number
The meaning of "scale" in "because diversions scale so easily wealth becomes concentrated"
How to approach protecting my code as a research assistant? Should I be worried in the first place?
Is the first page of a novel really that important?
Based on what criteria do you add/not add icons to labels within a toolbar?
How does LIDAR avoid getting confused in an environment being scanned by hundreds of other LIDAR?
How to make attic easier to traverse?
Does the length of a password for Wi-Fi affect speed?
I am considering a visit to a Nevada brothel. What should I say at the US border?
If someone else uploads my GPL'd code to Github without my permission, is that a copyright violation?
split large formula in align
Does a humanoid possessed by a ghost register as undead to a paladin's Divine Sense?
Why does putting a dot after the URL remove login information?
Not been paid even after reminding the Treasurer; what should I do?
How do I get the =LEFT function in excel, to also take the number zero as the first number?
Plato and the knowledge of the forms
Find a text string in a file and output only the rest of the text that follows it?
Did Captain America make out with his niece?
What is an air conditioner compressor hard start kit and how does it work?
Find only those folders that contain a File with the same name as the Folder
Understanding the -exec option of `find`Why can't I have a folder and a file with the same name?Find directories that do not contain subdirectoriesHow to find file/directory names that are the same, but with different capitalization/case?Merging folders with practically the same name but different casingFind all tar.gz files and move them to a one level down directoryConditional statements: finding folders that don't contain a particular filefind xml file that contain specific tag name and print the words between tag nameFind all files with the same nameUnzip to a folder with the same nameFind directories that do not contain a file in only directories proceeding a specific directory
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
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
add a comment |
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
1
Regarding your final remarks. Note that some answers do different things from others. Mine and Stéphane's for example, interpreted your first "Note" as "if there are other markdown files in the directory whatsoever, don't return that directory" while the others don't (as far as I can see). Apart from that, only you can pick the answer that is most helpful to you. Answers here will continue to receive up and down votes after you have accepted an answer, depending on what other readers find most useful.
– Kusalananda♦
9 hours ago
add a comment |
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
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
find directory filenames gnu
edited 9 hours ago
Nikhil
asked 11 hours ago
NikhilNikhil
3963 silver badges16 bronze badges
3963 silver badges16 bronze badges
1
Regarding your final remarks. Note that some answers do different things from others. Mine and Stéphane's for example, interpreted your first "Note" as "if there are other markdown files in the directory whatsoever, don't return that directory" while the others don't (as far as I can see). Apart from that, only you can pick the answer that is most helpful to you. Answers here will continue to receive up and down votes after you have accepted an answer, depending on what other readers find most useful.
– Kusalananda♦
9 hours ago
add a comment |
1
Regarding your final remarks. Note that some answers do different things from others. Mine and Stéphane's for example, interpreted your first "Note" as "if there are other markdown files in the directory whatsoever, don't return that directory" while the others don't (as far as I can see). Apart from that, only you can pick the answer that is most helpful to you. Answers here will continue to receive up and down votes after you have accepted an answer, depending on what other readers find most useful.
– Kusalananda♦
9 hours ago
1
1
Regarding your final remarks. Note that some answers do different things from others. Mine and Stéphane's for example, interpreted your first "Note" as "if there are other markdown files in the directory whatsoever, don't return that directory" while the others don't (as far as I can see). Apart from that, only you can pick the answer that is most helpful to you. Answers here will continue to receive up and down votes after you have accepted an answer, depending on what other readers find most useful.
– Kusalananda♦
9 hours ago
Regarding your final remarks. Note that some answers do different things from others. Mine and Stéphane's for example, interpreted your first "Note" as "if there are other markdown files in the directory whatsoever, don't return that directory" while the others don't (as far as I can see). Apart from that, only you can pick the answer that is most helpful to you. Answers here will continue to receive up and down votes after you have accepted an answer, depending on what other readers find most useful.
– Kusalananda♦
9 hours ago
add a comment |
5 Answers
5
active
oldest
votes
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`
add a comment |
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'
2
would you mind re-including your proposed zsh solution as an alternate? it would be helpful for those of us trying to learn more about zsh
– steeldriver
10 hours ago
Given that this answer has received more votes: To those who are upvoting this answer, could you please specify why this is better than the rest? It would help me to choose the most suitable answer.
– Nikhil
9 hours ago
Stéphane, I agree with steeldriver. Do mention the previouszsh
solution (it got, I believe, two of the upvotes), and feel free to point out any flaws in it that might have prompted you to remove it.
– Kusalananda♦
9 hours ago
@steeldriver, in that zsh approach I (like you) had missed the part of the requirement that dirs that contain other md files should be omitted.
– Stéphane Chazelas
7 hours ago
add a comment |
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
Even without GNU find:find . -type f | egrep '.*/([^/]+)/1.md$'
– Jim L.
9 hours ago
@JimL. Except that piping it to a line-oriented tool would break on some characters in filenames, like newline.
– Kusalananda♦
8 hours ago
@Kusalananda Agreed, however, this particular answer is predicated on "sensibly named" files that don't requireprint0
.
– Jim L.
8 hours ago
add a comment |
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).
add a comment |
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.
New contributor
That would be because I apparently can't remember bash commands or how they work.
– Zach Sanchez
11 hours ago
dirname
is the command you're looking for, and assignments can't have spaces around the=
.
– Kusalananda♦
11 hours ago
Found that out pretty quickly after it was pointed out, and the spaces were a typo.
– Zach Sanchez
11 hours ago
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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`
add a comment |
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`
add a comment |
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`
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`
edited 10 hours ago
answered 11 hours ago
Kusalananda♦Kusalananda
158k18 gold badges313 silver badges498 bronze badges
158k18 gold badges313 silver badges498 bronze badges
add a comment |
add a comment |
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'
2
would you mind re-including your proposed zsh solution as an alternate? it would be helpful for those of us trying to learn more about zsh
– steeldriver
10 hours ago
Given that this answer has received more votes: To those who are upvoting this answer, could you please specify why this is better than the rest? It would help me to choose the most suitable answer.
– Nikhil
9 hours ago
Stéphane, I agree with steeldriver. Do mention the previouszsh
solution (it got, I believe, two of the upvotes), and feel free to point out any flaws in it that might have prompted you to remove it.
– Kusalananda♦
9 hours ago
@steeldriver, in that zsh approach I (like you) had missed the part of the requirement that dirs that contain other md files should be omitted.
– Stéphane Chazelas
7 hours ago
add a comment |
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'
2
would you mind re-including your proposed zsh solution as an alternate? it would be helpful for those of us trying to learn more about zsh
– steeldriver
10 hours ago
Given that this answer has received more votes: To those who are upvoting this answer, could you please specify why this is better than the rest? It would help me to choose the most suitable answer.
– Nikhil
9 hours ago
Stéphane, I agree with steeldriver. Do mention the previouszsh
solution (it got, I believe, two of the upvotes), and feel free to point out any flaws in it that might have prompted you to remove it.
– Kusalananda♦
9 hours ago
@steeldriver, in that zsh approach I (like you) had missed the part of the requirement that dirs that contain other md files should be omitted.
– Stéphane Chazelas
7 hours ago
add a comment |
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'
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'
edited 11 hours ago
answered 11 hours ago
Stéphane ChazelasStéphane Chazelas
328k57 gold badges638 silver badges1006 bronze badges
328k57 gold badges638 silver badges1006 bronze badges
2
would you mind re-including your proposed zsh solution as an alternate? it would be helpful for those of us trying to learn more about zsh
– steeldriver
10 hours ago
Given that this answer has received more votes: To those who are upvoting this answer, could you please specify why this is better than the rest? It would help me to choose the most suitable answer.
– Nikhil
9 hours ago
Stéphane, I agree with steeldriver. Do mention the previouszsh
solution (it got, I believe, two of the upvotes), and feel free to point out any flaws in it that might have prompted you to remove it.
– Kusalananda♦
9 hours ago
@steeldriver, in that zsh approach I (like you) had missed the part of the requirement that dirs that contain other md files should be omitted.
– Stéphane Chazelas
7 hours ago
add a comment |
2
would you mind re-including your proposed zsh solution as an alternate? it would be helpful for those of us trying to learn more about zsh
– steeldriver
10 hours ago
Given that this answer has received more votes: To those who are upvoting this answer, could you please specify why this is better than the rest? It would help me to choose the most suitable answer.
– Nikhil
9 hours ago
Stéphane, I agree with steeldriver. Do mention the previouszsh
solution (it got, I believe, two of the upvotes), and feel free to point out any flaws in it that might have prompted you to remove it.
– Kusalananda♦
9 hours ago
@steeldriver, in that zsh approach I (like you) had missed the part of the requirement that dirs that contain other md files should be omitted.
– Stéphane Chazelas
7 hours ago
2
2
would you mind re-including your proposed zsh solution as an alternate? it would be helpful for those of us trying to learn more about zsh
– steeldriver
10 hours ago
would you mind re-including your proposed zsh solution as an alternate? it would be helpful for those of us trying to learn more about zsh
– steeldriver
10 hours ago
Given that this answer has received more votes: To those who are upvoting this answer, could you please specify why this is better than the rest? It would help me to choose the most suitable answer.
– Nikhil
9 hours ago
Given that this answer has received more votes: To those who are upvoting this answer, could you please specify why this is better than the rest? It would help me to choose the most suitable answer.
– Nikhil
9 hours ago
Stéphane, I agree with steeldriver. Do mention the previous
zsh
solution (it got, I believe, two of the upvotes), and feel free to point out any flaws in it that might have prompted you to remove it.– Kusalananda♦
9 hours ago
Stéphane, I agree with steeldriver. Do mention the previous
zsh
solution (it got, I believe, two of the upvotes), and feel free to point out any flaws in it that might have prompted you to remove it.– Kusalananda♦
9 hours ago
@steeldriver, in that zsh approach I (like you) had missed the part of the requirement that dirs that contain other md files should be omitted.
– Stéphane Chazelas
7 hours ago
@steeldriver, in that zsh approach I (like you) had missed the part of the requirement that dirs that contain other md files should be omitted.
– Stéphane Chazelas
7 hours ago
add a comment |
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
Even without GNU find:find . -type f | egrep '.*/([^/]+)/1.md$'
– Jim L.
9 hours ago
@JimL. Except that piping it to a line-oriented tool would break on some characters in filenames, like newline.
– Kusalananda♦
8 hours ago
@Kusalananda Agreed, however, this particular answer is predicated on "sensibly named" files that don't requireprint0
.
– Jim L.
8 hours ago
add a comment |
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
Even without GNU find:find . -type f | egrep '.*/([^/]+)/1.md$'
– Jim L.
9 hours ago
@JimL. Except that piping it to a line-oriented tool would break on some characters in filenames, like newline.
– Kusalananda♦
8 hours ago
@Kusalananda Agreed, however, this particular answer is predicated on "sensibly named" files that don't requireprint0
.
– Jim L.
8 hours ago
add a comment |
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
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
answered 10 hours ago
ThorThor
12.6k1 gold badge40 silver badges63 bronze badges
12.6k1 gold badge40 silver badges63 bronze badges
Even without GNU find:find . -type f | egrep '.*/([^/]+)/1.md$'
– Jim L.
9 hours ago
@JimL. Except that piping it to a line-oriented tool would break on some characters in filenames, like newline.
– Kusalananda♦
8 hours ago
@Kusalananda Agreed, however, this particular answer is predicated on "sensibly named" files that don't requireprint0
.
– Jim L.
8 hours ago
add a comment |
Even without GNU find:find . -type f | egrep '.*/([^/]+)/1.md$'
– Jim L.
9 hours ago
@JimL. Except that piping it to a line-oriented tool would break on some characters in filenames, like newline.
– Kusalananda♦
8 hours ago
@Kusalananda Agreed, however, this particular answer is predicated on "sensibly named" files that don't requireprint0
.
– Jim L.
8 hours ago
Even without GNU find:
find . -type f | egrep '.*/([^/]+)/1.md$'
– Jim L.
9 hours ago
Even without GNU find:
find . -type f | egrep '.*/([^/]+)/1.md$'
– Jim L.
9 hours ago
@JimL. Except that piping it to a line-oriented tool would break on some characters in filenames, like newline.
– Kusalananda♦
8 hours ago
@JimL. Except that piping it to a line-oriented tool would break on some characters in filenames, like newline.
– Kusalananda♦
8 hours ago
@Kusalananda Agreed, however, this particular answer is predicated on "sensibly named" files that don't require
print0
.– Jim L.
8 hours ago
@Kusalananda Agreed, however, this particular answer is predicated on "sensibly named" files that don't require
print0
.– Jim L.
8 hours ago
add a comment |
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).
add a comment |
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).
add a comment |
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).
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).
edited 10 hours ago
answered 11 hours ago
steeldriversteeldriver
41.8k4 gold badges56 silver badges94 bronze badges
41.8k4 gold badges56 silver badges94 bronze badges
add a comment |
add a comment |
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.
New contributor
That would be because I apparently can't remember bash commands or how they work.
– Zach Sanchez
11 hours ago
dirname
is the command you're looking for, and assignments can't have spaces around the=
.
– Kusalananda♦
11 hours ago
Found that out pretty quickly after it was pointed out, and the spaces were a typo.
– Zach Sanchez
11 hours ago
add a comment |
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.
New contributor
That would be because I apparently can't remember bash commands or how they work.
– Zach Sanchez
11 hours ago
dirname
is the command you're looking for, and assignments can't have spaces around the=
.
– Kusalananda♦
11 hours ago
Found that out pretty quickly after it was pointed out, and the spaces were a typo.
– Zach Sanchez
11 hours ago
add a comment |
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.
New contributor
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.
New contributor
edited 11 hours ago
New contributor
answered 11 hours ago
Zach SanchezZach Sanchez
563 bronze badges
563 bronze badges
New contributor
New contributor
That would be because I apparently can't remember bash commands or how they work.
– Zach Sanchez
11 hours ago
dirname
is the command you're looking for, and assignments can't have spaces around the=
.
– Kusalananda♦
11 hours ago
Found that out pretty quickly after it was pointed out, and the spaces were a typo.
– Zach Sanchez
11 hours ago
add a comment |
That would be because I apparently can't remember bash commands or how they work.
– Zach Sanchez
11 hours ago
dirname
is the command you're looking for, and assignments can't have spaces around the=
.
– Kusalananda♦
11 hours ago
Found that out pretty quickly after it was pointed out, and the spaces were a typo.
– Zach Sanchez
11 hours ago
That would be because I apparently can't remember bash commands or how they work.
– Zach Sanchez
11 hours ago
That would be because I apparently can't remember bash commands or how they work.
– Zach Sanchez
11 hours ago
dirname
is the command you're looking for, and assignments can't have spaces around the =
.– Kusalananda♦
11 hours ago
dirname
is the command you're looking for, and assignments can't have spaces around the =
.– Kusalananda♦
11 hours ago
Found that out pretty quickly after it was pointed out, and the spaces were a typo.
– Zach Sanchez
11 hours ago
Found that out pretty quickly after it was pointed out, and the spaces were a typo.
– Zach Sanchez
11 hours ago
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
1
Regarding your final remarks. Note that some answers do different things from others. Mine and Stéphane's for example, interpreted your first "Note" as "if there are other markdown files in the directory whatsoever, don't return that directory" while the others don't (as far as I can see). Apart from that, only you can pick the answer that is most helpful to you. Answers here will continue to receive up and down votes after you have accepted an answer, depending on what other readers find most useful.
– Kusalananda♦
9 hours ago