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?













8















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!










share|improve this question




















  • 3





    +1 for providing an almost working solution!

    – user5325
    yesterday
















8















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!










share|improve this question




















  • 3





    +1 for providing an almost working solution!

    – user5325
    yesterday














8












8








8


0






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!










share|improve this question
















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






share|improve this question















share|improve this question













share|improve this question




share|improve this question








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














  • 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










2 Answers
2






active

oldest

votes


















7














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.






share|improve this answer


























  • 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













  • 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



















2














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`);.






share|improve this answer
























  • 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













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
});


}
});














draft saved

draft discarded


















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









7














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.






share|improve this answer


























  • 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













  • 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
















7














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.






share|improve this answer


























  • 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













  • 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














7












7








7







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.






share|improve this answer















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.







share|improve this answer














share|improve this answer



share|improve this answer








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 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













  • 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



















  • 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













  • 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

















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













2














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`);.






share|improve this answer
























  • 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


















2














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`);.






share|improve this answer
























  • 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
















2












2








2







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`);.






share|improve this answer













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`);.







share|improve this answer












share|improve this answer



share|improve this answer










answered yesterday









cauoncauon

1,6341021




1,6341021













  • 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



















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




















draft saved

draft discarded




















































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.




draft saved


draft discarded














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





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

is 'sed' thread safeWhat should someone know about using Python scripts in the shell?Nexenta bash script uses...

How do i solve the “ No module named 'mlxtend' ” issue on Jupyter?

Pilgersdorf Inhaltsverzeichnis Geografie | Geschichte | Bevölkerungsentwicklung | Politik | Kultur...