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;
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♦
6 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 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
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♦
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
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
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 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♦
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
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.
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 requireprint0
.
– Jim L.
5 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
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
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 8 hours ago
answered 8 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
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 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♦
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
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
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 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♦
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
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 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 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♦
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
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
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 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♦
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
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.
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 requireprint0
.
– Jim L.
5 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.
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 requireprint0
.
– Jim L.
5 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 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 requireprint0
.
– Jim L.
5 hours ago
add a comment |
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 requireprint0
.
– 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
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 8 hours ago
answered 8 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
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
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
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
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 8 hours ago
New contributor
answered 8 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
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
add a comment |
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
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♦
6 hours ago