Folder comparisonSame folder, different sizeBash comparison and expression operatorsUnity desktop folder...
Greatest common substring
What is the term when two people sing in harmony, but they aren't singing the same notes?
Books on the History of math research at European universities
How will losing mobility of one hand affect my career as a programmer?
Bob has never been a M before
Could solar power be utilized and substitute coal in the 19th century?
Adding empty element to declared container without declaring type of element
Is infinity mathematically observable?
Why is delta-v is the most useful quantity for planning space travel?
Can I use my Chinese passport to enter China after I acquired another citizenship?
I2C signal and power over long range (10meter cable)
What do you call the infoboxes with text and sometimes images on the side of a page we find in textbooks?
Lightning Web Component - do I need to track changes for every single input field in a form
A workplace installs custom certificates on personal devices, can this be used to decrypt HTTPS traffic?
Pronouncing Homer as in modern Greek
Indicating multiple different modes of speech (fantasy language or telepathy)
What does the "3am" section means in manpages?
Blender - show edges angles “direction”
Freedom of speech and where it applies
For airliners, what prevents wing strikes on landing in bad weather?
Science Fiction story where a man invents a machine that can help him watch history unfold
Are taller landing gear bad for aircraft, particulary large airliners?
Simple recursive Sudoku solver
Installing PowerShell on 32-bit Kali OS fails
Folder comparison
Same folder, different sizeBash comparison and expression operatorsUnity desktop folder conundrumBash script, cannote replace string in a file with escaped $ and &Folder name comparing - scriptHow to get real-time completion/suggestions in Linux terminal?Complex Number and String comparisonFolder permission issue17.10 personal folder locationCreate bash script that allows you to choose multiple options instead of just one?
I have two folders with similar subfolder structures, which I would like to compare. For example:
A
├── child-1
├── child-2
├── child-3
├── child-4
├── child-5
and
B
├── child-1-some-text
├── child-2-more-text
├── child-3-nothing
├── child-6-random-text
├── child-7-more-random-text
I would like to list all those subfolders from A
which are prefix for a subfolder in B
and list corresponding subfolders from B
as well. The expected output is
child-1 -- child-1-some-text
child-2 -- child-2-more-text
child-3 -- child-3-nothing
A secondary requirement: If multiple matches in B
, then it should give an error / warning.
My solution:
cd A
for f in `ls -d */`;
do
cd B;
new_dirs=(`ls -1d $f*`);
cd -;
if [ ${#new_dirs[@]} -eq 0 ]
then
## DO_Nothing
continue;
elif [ ${#new_dirs[@]} -gt 1 ]
then
echo "Multiple matches to $f";
continue;
else
echo "Unique Match found to $f -- ${new_dirs[0]}";
continue;
fi;
done
Problem:
For those values of $f
, which have no corresponding subfolders in B
, the array construction is giving me an error. e.g.:
ls: cannot access 'child-4*': No such file or directory
Question
- How to get rid of these errors?
- Is there better way to achieve the goal(s) then the one in my code?
Thanks in advance!
bash directory
add a comment |
I have two folders with similar subfolder structures, which I would like to compare. For example:
A
├── child-1
├── child-2
├── child-3
├── child-4
├── child-5
and
B
├── child-1-some-text
├── child-2-more-text
├── child-3-nothing
├── child-6-random-text
├── child-7-more-random-text
I would like to list all those subfolders from A
which are prefix for a subfolder in B
and list corresponding subfolders from B
as well. The expected output is
child-1 -- child-1-some-text
child-2 -- child-2-more-text
child-3 -- child-3-nothing
A secondary requirement: If multiple matches in B
, then it should give an error / warning.
My solution:
cd A
for f in `ls -d */`;
do
cd B;
new_dirs=(`ls -1d $f*`);
cd -;
if [ ${#new_dirs[@]} -eq 0 ]
then
## DO_Nothing
continue;
elif [ ${#new_dirs[@]} -gt 1 ]
then
echo "Multiple matches to $f";
continue;
else
echo "Unique Match found to $f -- ${new_dirs[0]}";
continue;
fi;
done
Problem:
For those values of $f
, which have no corresponding subfolders in B
, the array construction is giving me an error. e.g.:
ls: cannot access 'child-4*': No such file or directory
Question
- How to get rid of these errors?
- Is there better way to achieve the goal(s) then the one in my code?
Thanks in advance!
bash directory
3
+1 for providing an almost working solution!
– user5325
yesterday
add a comment |
I have two folders with similar subfolder structures, which I would like to compare. For example:
A
├── child-1
├── child-2
├── child-3
├── child-4
├── child-5
and
B
├── child-1-some-text
├── child-2-more-text
├── child-3-nothing
├── child-6-random-text
├── child-7-more-random-text
I would like to list all those subfolders from A
which are prefix for a subfolder in B
and list corresponding subfolders from B
as well. The expected output is
child-1 -- child-1-some-text
child-2 -- child-2-more-text
child-3 -- child-3-nothing
A secondary requirement: If multiple matches in B
, then it should give an error / warning.
My solution:
cd A
for f in `ls -d */`;
do
cd B;
new_dirs=(`ls -1d $f*`);
cd -;
if [ ${#new_dirs[@]} -eq 0 ]
then
## DO_Nothing
continue;
elif [ ${#new_dirs[@]} -gt 1 ]
then
echo "Multiple matches to $f";
continue;
else
echo "Unique Match found to $f -- ${new_dirs[0]}";
continue;
fi;
done
Problem:
For those values of $f
, which have no corresponding subfolders in B
, the array construction is giving me an error. e.g.:
ls: cannot access 'child-4*': No such file or directory
Question
- How to get rid of these errors?
- Is there better way to achieve the goal(s) then the one in my code?
Thanks in advance!
bash directory
I have two folders with similar subfolder structures, which I would like to compare. For example:
A
├── child-1
├── child-2
├── child-3
├── child-4
├── child-5
and
B
├── child-1-some-text
├── child-2-more-text
├── child-3-nothing
├── child-6-random-text
├── child-7-more-random-text
I would like to list all those subfolders from A
which are prefix for a subfolder in B
and list corresponding subfolders from B
as well. The expected output is
child-1 -- child-1-some-text
child-2 -- child-2-more-text
child-3 -- child-3-nothing
A secondary requirement: If multiple matches in B
, then it should give an error / warning.
My solution:
cd A
for f in `ls -d */`;
do
cd B;
new_dirs=(`ls -1d $f*`);
cd -;
if [ ${#new_dirs[@]} -eq 0 ]
then
## DO_Nothing
continue;
elif [ ${#new_dirs[@]} -gt 1 ]
then
echo "Multiple matches to $f";
continue;
else
echo "Unique Match found to $f -- ${new_dirs[0]}";
continue;
fi;
done
Problem:
For those values of $f
, which have no corresponding subfolders in B
, the array construction is giving me an error. e.g.:
ls: cannot access 'child-4*': No such file or directory
Question
- How to get rid of these errors?
- Is there better way to achieve the goal(s) then the one in my code?
Thanks in advance!
bash directory
bash directory
edited yesterday
wjandrea
9,45042664
9,45042664
asked yesterday
Mike V.D.C.Mike V.D.C.
3051211
3051211
3
+1 for providing an almost working solution!
– user5325
yesterday
add a comment |
3
+1 for providing an almost working solution!
– user5325
yesterday
3
3
+1 for providing an almost working solution!
– user5325
yesterday
+1 for providing an almost working solution!
– user5325
yesterday
add a comment |
2 Answers
2
active
oldest
votes
The better way
Don't parse ls
; use globs instead. In fact you're already using globs, just wrapping them in ls
, which is pointless. You just need nullglob
turned on for when there are no matches.
Also avoiding cd
simplifies things.
#!/bin/bash
shopt -s nullglob
dir1=A
dir2=B
for dir in "$dir1"/*/; do
basename="$(basename -- "$dir")"
dirs_match=( "$dir2/$basename"*/ )
case ${#dirs_match[@]} in
0)
;;
1)
echo "Unique match for $dir: ${dirs_match[*]}"
;;
*)
echo "Multiple matches for $dir: ${dirs_match[*]}" >&2
;;
esac
done
Output:
Unique match for A/child-1/: B/child-1-some-text/
Unique match for A/child-2/: B/child-2-more-text/
Multiple matches for A/child-3/: B/child-3-nothing/ B/child-3-something/
I added B/child-3-something
to test the secondary requirement. This creates the directory structure for testing:
mkdir -p A/child-{1..5} B/child-{1-some-text,2-more-text,3-nothing,3-something,6-random-text,7-more-random-text}
By the way, ShellCheck is very useful for finding problems in shell scripts.
ShellCheck.net is interesting, do you know if it uploads everything to it's own servers, or is it all done locally? Just wondering about the privacy of entered info. [Installing theshellcheck
package would be the most secure]
– Xen2050
yesterday
@Xen2050 Just tried toggling my internet off while on the site, and it seems to upload. I would imagine it doesn't keep it, but not sure. And yes the package is good; I use an Atom plugin that uses it.
– wjandrea
yesterday
Thanks for the suggestions. And also tons of thanks for pointing towardsShellCheck
. I loved the part where it not only tells you your errors, but also gives suggestions! @Xen2050, about the uploading part, I just installedshellcheck
usingapt
and then disabled network. It seems to be working without internet.
– Mike V.D.C.
21 hours ago
add a comment |
Calling ls
on a non existent folder throws the error message that you encountered. The easy way is to just ignore this by replacing line 5 in your script with this: new_dirs=(`ls -1d $f* 2> /dev/null`);
.
Have you tested this? Stderr seems to get ignored by default, when I runt=(`echo ok; echo err 1>&2`)
$t (or${t[@]}
) only contains ok, err is seen in the terminal but not saved anyway. Or is there something funny about my test?
– Xen2050
3 hours ago
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "89"
};
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: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
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%2faskubuntu.com%2fquestions%2f1128280%2ffolder-comparison%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
The better way
Don't parse ls
; use globs instead. In fact you're already using globs, just wrapping them in ls
, which is pointless. You just need nullglob
turned on for when there are no matches.
Also avoiding cd
simplifies things.
#!/bin/bash
shopt -s nullglob
dir1=A
dir2=B
for dir in "$dir1"/*/; do
basename="$(basename -- "$dir")"
dirs_match=( "$dir2/$basename"*/ )
case ${#dirs_match[@]} in
0)
;;
1)
echo "Unique match for $dir: ${dirs_match[*]}"
;;
*)
echo "Multiple matches for $dir: ${dirs_match[*]}" >&2
;;
esac
done
Output:
Unique match for A/child-1/: B/child-1-some-text/
Unique match for A/child-2/: B/child-2-more-text/
Multiple matches for A/child-3/: B/child-3-nothing/ B/child-3-something/
I added B/child-3-something
to test the secondary requirement. This creates the directory structure for testing:
mkdir -p A/child-{1..5} B/child-{1-some-text,2-more-text,3-nothing,3-something,6-random-text,7-more-random-text}
By the way, ShellCheck is very useful for finding problems in shell scripts.
ShellCheck.net is interesting, do you know if it uploads everything to it's own servers, or is it all done locally? Just wondering about the privacy of entered info. [Installing theshellcheck
package would be the most secure]
– Xen2050
yesterday
@Xen2050 Just tried toggling my internet off while on the site, and it seems to upload. I would imagine it doesn't keep it, but not sure. And yes the package is good; I use an Atom plugin that uses it.
– wjandrea
yesterday
Thanks for the suggestions. And also tons of thanks for pointing towardsShellCheck
. I loved the part where it not only tells you your errors, but also gives suggestions! @Xen2050, about the uploading part, I just installedshellcheck
usingapt
and then disabled network. It seems to be working without internet.
– Mike V.D.C.
21 hours ago
add a comment |
The better way
Don't parse ls
; use globs instead. In fact you're already using globs, just wrapping them in ls
, which is pointless. You just need nullglob
turned on for when there are no matches.
Also avoiding cd
simplifies things.
#!/bin/bash
shopt -s nullglob
dir1=A
dir2=B
for dir in "$dir1"/*/; do
basename="$(basename -- "$dir")"
dirs_match=( "$dir2/$basename"*/ )
case ${#dirs_match[@]} in
0)
;;
1)
echo "Unique match for $dir: ${dirs_match[*]}"
;;
*)
echo "Multiple matches for $dir: ${dirs_match[*]}" >&2
;;
esac
done
Output:
Unique match for A/child-1/: B/child-1-some-text/
Unique match for A/child-2/: B/child-2-more-text/
Multiple matches for A/child-3/: B/child-3-nothing/ B/child-3-something/
I added B/child-3-something
to test the secondary requirement. This creates the directory structure for testing:
mkdir -p A/child-{1..5} B/child-{1-some-text,2-more-text,3-nothing,3-something,6-random-text,7-more-random-text}
By the way, ShellCheck is very useful for finding problems in shell scripts.
ShellCheck.net is interesting, do you know if it uploads everything to it's own servers, or is it all done locally? Just wondering about the privacy of entered info. [Installing theshellcheck
package would be the most secure]
– Xen2050
yesterday
@Xen2050 Just tried toggling my internet off while on the site, and it seems to upload. I would imagine it doesn't keep it, but not sure. And yes the package is good; I use an Atom plugin that uses it.
– wjandrea
yesterday
Thanks for the suggestions. And also tons of thanks for pointing towardsShellCheck
. I loved the part where it not only tells you your errors, but also gives suggestions! @Xen2050, about the uploading part, I just installedshellcheck
usingapt
and then disabled network. It seems to be working without internet.
– Mike V.D.C.
21 hours ago
add a comment |
The better way
Don't parse ls
; use globs instead. In fact you're already using globs, just wrapping them in ls
, which is pointless. You just need nullglob
turned on for when there are no matches.
Also avoiding cd
simplifies things.
#!/bin/bash
shopt -s nullglob
dir1=A
dir2=B
for dir in "$dir1"/*/; do
basename="$(basename -- "$dir")"
dirs_match=( "$dir2/$basename"*/ )
case ${#dirs_match[@]} in
0)
;;
1)
echo "Unique match for $dir: ${dirs_match[*]}"
;;
*)
echo "Multiple matches for $dir: ${dirs_match[*]}" >&2
;;
esac
done
Output:
Unique match for A/child-1/: B/child-1-some-text/
Unique match for A/child-2/: B/child-2-more-text/
Multiple matches for A/child-3/: B/child-3-nothing/ B/child-3-something/
I added B/child-3-something
to test the secondary requirement. This creates the directory structure for testing:
mkdir -p A/child-{1..5} B/child-{1-some-text,2-more-text,3-nothing,3-something,6-random-text,7-more-random-text}
By the way, ShellCheck is very useful for finding problems in shell scripts.
The better way
Don't parse ls
; use globs instead. In fact you're already using globs, just wrapping them in ls
, which is pointless. You just need nullglob
turned on for when there are no matches.
Also avoiding cd
simplifies things.
#!/bin/bash
shopt -s nullglob
dir1=A
dir2=B
for dir in "$dir1"/*/; do
basename="$(basename -- "$dir")"
dirs_match=( "$dir2/$basename"*/ )
case ${#dirs_match[@]} in
0)
;;
1)
echo "Unique match for $dir: ${dirs_match[*]}"
;;
*)
echo "Multiple matches for $dir: ${dirs_match[*]}" >&2
;;
esac
done
Output:
Unique match for A/child-1/: B/child-1-some-text/
Unique match for A/child-2/: B/child-2-more-text/
Multiple matches for A/child-3/: B/child-3-nothing/ B/child-3-something/
I added B/child-3-something
to test the secondary requirement. This creates the directory structure for testing:
mkdir -p A/child-{1..5} B/child-{1-some-text,2-more-text,3-nothing,3-something,6-random-text,7-more-random-text}
By the way, ShellCheck is very useful for finding problems in shell scripts.
edited yesterday
answered yesterday
wjandreawjandrea
9,45042664
9,45042664
ShellCheck.net is interesting, do you know if it uploads everything to it's own servers, or is it all done locally? Just wondering about the privacy of entered info. [Installing theshellcheck
package would be the most secure]
– Xen2050
yesterday
@Xen2050 Just tried toggling my internet off while on the site, and it seems to upload. I would imagine it doesn't keep it, but not sure. And yes the package is good; I use an Atom plugin that uses it.
– wjandrea
yesterday
Thanks for the suggestions. And also tons of thanks for pointing towardsShellCheck
. I loved the part where it not only tells you your errors, but also gives suggestions! @Xen2050, about the uploading part, I just installedshellcheck
usingapt
and then disabled network. It seems to be working without internet.
– Mike V.D.C.
21 hours ago
add a comment |
ShellCheck.net is interesting, do you know if it uploads everything to it's own servers, or is it all done locally? Just wondering about the privacy of entered info. [Installing theshellcheck
package would be the most secure]
– Xen2050
yesterday
@Xen2050 Just tried toggling my internet off while on the site, and it seems to upload. I would imagine it doesn't keep it, but not sure. And yes the package is good; I use an Atom plugin that uses it.
– wjandrea
yesterday
Thanks for the suggestions. And also tons of thanks for pointing towardsShellCheck
. I loved the part where it not only tells you your errors, but also gives suggestions! @Xen2050, about the uploading part, I just installedshellcheck
usingapt
and then disabled network. It seems to be working without internet.
– Mike V.D.C.
21 hours ago
ShellCheck.net is interesting, do you know if it uploads everything to it's own servers, or is it all done locally? Just wondering about the privacy of entered info. [Installing the
shellcheck
package would be the most secure]– Xen2050
yesterday
ShellCheck.net is interesting, do you know if it uploads everything to it's own servers, or is it all done locally? Just wondering about the privacy of entered info. [Installing the
shellcheck
package would be the most secure]– Xen2050
yesterday
@Xen2050 Just tried toggling my internet off while on the site, and it seems to upload. I would imagine it doesn't keep it, but not sure. And yes the package is good; I use an Atom plugin that uses it.
– wjandrea
yesterday
@Xen2050 Just tried toggling my internet off while on the site, and it seems to upload. I would imagine it doesn't keep it, but not sure. And yes the package is good; I use an Atom plugin that uses it.
– wjandrea
yesterday
Thanks for the suggestions. And also tons of thanks for pointing towards
ShellCheck
. I loved the part where it not only tells you your errors, but also gives suggestions! @Xen2050, about the uploading part, I just installed shellcheck
using apt
and then disabled network. It seems to be working without internet.– Mike V.D.C.
21 hours ago
Thanks for the suggestions. And also tons of thanks for pointing towards
ShellCheck
. I loved the part where it not only tells you your errors, but also gives suggestions! @Xen2050, about the uploading part, I just installed shellcheck
using apt
and then disabled network. It seems to be working without internet.– Mike V.D.C.
21 hours ago
add a comment |
Calling ls
on a non existent folder throws the error message that you encountered. The easy way is to just ignore this by replacing line 5 in your script with this: new_dirs=(`ls -1d $f* 2> /dev/null`);
.
Have you tested this? Stderr seems to get ignored by default, when I runt=(`echo ok; echo err 1>&2`)
$t (or${t[@]}
) only contains ok, err is seen in the terminal but not saved anyway. Or is there something funny about my test?
– Xen2050
3 hours ago
add a comment |
Calling ls
on a non existent folder throws the error message that you encountered. The easy way is to just ignore this by replacing line 5 in your script with this: new_dirs=(`ls -1d $f* 2> /dev/null`);
.
Have you tested this? Stderr seems to get ignored by default, when I runt=(`echo ok; echo err 1>&2`)
$t (or${t[@]}
) only contains ok, err is seen in the terminal but not saved anyway. Or is there something funny about my test?
– Xen2050
3 hours ago
add a comment |
Calling ls
on a non existent folder throws the error message that you encountered. The easy way is to just ignore this by replacing line 5 in your script with this: new_dirs=(`ls -1d $f* 2> /dev/null`);
.
Calling ls
on a non existent folder throws the error message that you encountered. The easy way is to just ignore this by replacing line 5 in your script with this: new_dirs=(`ls -1d $f* 2> /dev/null`);
.
answered yesterday
cauoncauon
1,6341021
1,6341021
Have you tested this? Stderr seems to get ignored by default, when I runt=(`echo ok; echo err 1>&2`)
$t (or${t[@]}
) only contains ok, err is seen in the terminal but not saved anyway. Or is there something funny about my test?
– Xen2050
3 hours ago
add a comment |
Have you tested this? Stderr seems to get ignored by default, when I runt=(`echo ok; echo err 1>&2`)
$t (or${t[@]}
) only contains ok, err is seen in the terminal but not saved anyway. Or is there something funny about my test?
– Xen2050
3 hours ago
Have you tested this? Stderr seems to get ignored by default, when I run
t=(`echo ok; echo err 1>&2`)
$t (or ${t[@]}
) only contains ok, err is seen in the terminal but not saved anyway. Or is there something funny about my test?– Xen2050
3 hours ago
Have you tested this? Stderr seems to get ignored by default, when I run
t=(`echo ok; echo err 1>&2`)
$t (or ${t[@]}
) only contains ok, err is seen in the terminal but not saved anyway. Or is there something funny about my test?– Xen2050
3 hours ago
add a comment |
Thanks for contributing an answer to Ask Ubuntu!
- 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%2faskubuntu.com%2fquestions%2f1128280%2ffolder-comparison%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
3
+1 for providing an almost working solution!
– user5325
yesterday