Folder comparisonSame 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?

What should I use for Mishna study?

Can a Bard use an arcane focus?

A social experiment. What is the worst that can happen?

Bob has never been a M before

Visiting the UK as unmarried couple

Simple recursive Sudoku solver

The One-Electron Universe postulate is true - what simple change can I make to change the whole universe?

Latex for-and in equation

Books on the History of math research at European universities

Invariance of results when scaling explanatory variables in logistic regression, is there a proof?

Identify a stage play about a VR experience in which participants are encouraged to simulate performing horrific activities

Organic chemistry Iodoform Reaction

What is Sitecore Managed Cloud?

Can I create an upright 7-foot × 5-foot wall with the Minor Illusion spell?

Female=gender counterpart?

Greatest common substring

Reply ‘no position’ while the job posting is still there (‘HiWi’ position in Germany)

Have I saved too much for retirement so far?

Is it okay / does it make sense for another player to join a running game of Munchkin?

Simulating a probability of 1 of 2^N with less than N random bits

node command while defining a coordinate in TikZ

The most efficient algorithm to find all possible integer pairs which sum to a given integer

Can I rely on these GitHub repository files?

Are Warlocks Arcane or Divine?



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

Sum ergo cogito? 1 nng

419 nièngy_Soadمي 19bal1.5o_g

Queiggey Chernihivv 9NnOo i Zw X QqKk LpB