Checking for the existence of multiple directories












5















I want to check for the existence of multiple directories, say, dir1, dir2 and dir3, in the working directory.



I have the following



if [ -d "$PWD/dir1" ] && [ -d "$PWD/dir2" ] && [ -d "$PWD/dir3" ]; then
echo True
else
echo False
fi


But I suspect there is a more elegant way of doing this. Do not assume that there is a rule in the names of the directories.



The goal is to check for the existence of a few directories and for the nonexistence of others.



I'm using Bash, but portable code is preferred.










share|improve this question









New contributor




Elegance is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





















  • “The goal is to check for the existence of a few directories and for the nonexistence of others.” Well, your example checks for existence of all listed directories. Can you elaborate on this part ? Is it all listed or any listed ? Do you need a check that passed values are in fact directories and not other types of files ?

    – Sergiy Kolodyazhnyy
    14 mins ago


















5















I want to check for the existence of multiple directories, say, dir1, dir2 and dir3, in the working directory.



I have the following



if [ -d "$PWD/dir1" ] && [ -d "$PWD/dir2" ] && [ -d "$PWD/dir3" ]; then
echo True
else
echo False
fi


But I suspect there is a more elegant way of doing this. Do not assume that there is a rule in the names of the directories.



The goal is to check for the existence of a few directories and for the nonexistence of others.



I'm using Bash, but portable code is preferred.










share|improve this question









New contributor




Elegance is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





















  • “The goal is to check for the existence of a few directories and for the nonexistence of others.” Well, your example checks for existence of all listed directories. Can you elaborate on this part ? Is it all listed or any listed ? Do you need a check that passed values are in fact directories and not other types of files ?

    – Sergiy Kolodyazhnyy
    14 mins ago
















5












5








5








I want to check for the existence of multiple directories, say, dir1, dir2 and dir3, in the working directory.



I have the following



if [ -d "$PWD/dir1" ] && [ -d "$PWD/dir2" ] && [ -d "$PWD/dir3" ]; then
echo True
else
echo False
fi


But I suspect there is a more elegant way of doing this. Do not assume that there is a rule in the names of the directories.



The goal is to check for the existence of a few directories and for the nonexistence of others.



I'm using Bash, but portable code is preferred.










share|improve this question









New contributor




Elegance is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












I want to check for the existence of multiple directories, say, dir1, dir2 and dir3, in the working directory.



I have the following



if [ -d "$PWD/dir1" ] && [ -d "$PWD/dir2" ] && [ -d "$PWD/dir3" ]; then
echo True
else
echo False
fi


But I suspect there is a more elegant way of doing this. Do not assume that there is a rule in the names of the directories.



The goal is to check for the existence of a few directories and for the nonexistence of others.



I'm using Bash, but portable code is preferred.







shell-script shell files directory control-flow






share|improve this question









New contributor




Elegance is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




Elegance is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited 10 hours ago







Elegance













New contributor




Elegance is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked 12 hours ago









EleganceElegance

283




283




New contributor




Elegance is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





Elegance is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






Elegance is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.













  • “The goal is to check for the existence of a few directories and for the nonexistence of others.” Well, your example checks for existence of all listed directories. Can you elaborate on this part ? Is it all listed or any listed ? Do you need a check that passed values are in fact directories and not other types of files ?

    – Sergiy Kolodyazhnyy
    14 mins ago





















  • “The goal is to check for the existence of a few directories and for the nonexistence of others.” Well, your example checks for existence of all listed directories. Can you elaborate on this part ? Is it all listed or any listed ? Do you need a check that passed values are in fact directories and not other types of files ?

    – Sergiy Kolodyazhnyy
    14 mins ago



















“The goal is to check for the existence of a few directories and for the nonexistence of others.” Well, your example checks for existence of all listed directories. Can you elaborate on this part ? Is it all listed or any listed ? Do you need a check that passed values are in fact directories and not other types of files ?

– Sergiy Kolodyazhnyy
14 mins ago







“The goal is to check for the existence of a few directories and for the nonexistence of others.” Well, your example checks for existence of all listed directories. Can you elaborate on this part ? Is it all listed or any listed ? Do you need a check that passed values are in fact directories and not other types of files ?

– Sergiy Kolodyazhnyy
14 mins ago












5 Answers
5






active

oldest

votes


















6














If you already expect them to be directories and are just checking whether they all exist, you could use the exit code from the ls utility to determine whether one or more "errors occurred":



ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir3" >/dev/null 2>&1 && echo All there


I redirect the output and stderr to /dev/null in order to make it disappear, since we only care about the exit code from ls, not its output. Anything that's written to /dev/null disappears — it is not written to your terminal.






share|improve this answer


























  • Can you help me understand this command? I know what file descriptors are. I know 1 is stdout, 2 is stderr and I know what redirecting is. I don't understand the significance of /dev/null, and I do not know how to parse the command.

    – Elegance
    10 hours ago











  • @Elegance I added a little explanation. For more in-depth answers regarding /dev/null, see unix.stackexchange.com/questions/163352/… and unix.stackexchange.com/questions/438130/…

    – Jeff Schaller
    10 hours ago











  • Still trying to figure out how the syntax works. I read that &>filename redirects both stdout and stderr to filename. So couldn't the command be simplified (at least to me it is more simple) as ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir2" &>/dev/null && echo All there?

    – Elegance
    10 hours ago








  • 1





    I got it finally. Thanks.

    – Elegance
    10 hours ago






  • 1





    (1) You should probably use the -d option (a) so ls needs only to stat the directories, and not read them, and (b) so the command will succeed even if the user doesn’t have read access to the directories.  (2) I don’t see any reason to use "$PWD/" except to guard against directories whose names begin with - (and, of course, there are better ways to do that).

    – G-Man
    2 hours ago



















8














I would loop:



result=True
for dir in
"$PWD/dir1"
"$PWD/dir2"
"$PWD/dir3"
do
if ! [ -d "$dir" ]; then
result=False
break
fi
done
echo "$result"


The break causes the loop to short-circuit, just like your chain of &&






share|improve this answer































    4














    A loop might be more elegant:



    arr=("$PWD/dir1" "$PWD/dir2" "$PWD/dir2")
    for d in "${arr[@]}"; do
    if [ -d "$d"]; then
    echo True
    else
    echo False
    fi
    done


    This is Bash. A more portable one is Sh. There you can use the positional array:



    set -- "$PWD/dir1" "$PWD/dir2" "$PWD/dir2"


    Then to loop over it use "$@".






    share|improve this answer

































      1














      Why not just:



      if [ -d "dir1" -a -d "dir2" -a -d "dir3" ]; then
      echo True
      else
      echo False
      fi





      share|improve this answer
























      • This is essentially what the OP started with, But I suspect there is a more elegant way of doing this

        – Jeff Schaller
        8 hours ago






      • 2





        Also POSIX discourages the use of -a: "-a and -o binary primaries (...) operators have been marked obsolescent": pubs.opengroup.org/onlinepubs/9699919799

        – Elegance
        8 hours ago













      • @JeffSchaller It's more terse since it does it all in one call to test.

        – David Conrad
        5 hours ago











      • @Elegance They're still supported on all the systems I use, and probably will be a hundred years from now.

        – David Conrad
        5 hours ago



















      0















      The goal is to check for the existence of a few directories
      and for the nonexistence of others. 
      [Emphasis added]




      Building on glenn jackman’s answer,
      we can test for the nonexistence of other names like this:


      result=True
      for dir in
      "$PWD/dir1"
      "$PWD/dir2"
      "$PWD/dir3"
      do
      if ! [ -d "$dir" ]; then
      result=False
      break
      fi
      done
      for dir in
      "$PWD/dir4"
      "$PWD/dir5"
      "$PWD/dir6"
      do
      if [ -e "$dir" ]; then # Note: no “!”
      result=False
      break
      fi
      done

      echo "$result"

      I used [ -e "$dir" ] to test whether "$dir" exists;
      i.e., if dir5 exists but is a file, the result is False
      If you want only to test whether the names in the second group are directories,
      use [ -d "$dir" ], like in the first loop.

      Since we’re talking about checking for the existence of things
      in the current working directory,
      it’s probably not necessary to specify $PWD/ on the names; just do




      for dir in 
      "dir1"
      "dir2"
      "dir3"
      do





      share|improve this answer























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


        }
        });






        Elegance is a new contributor. Be nice, and check out our Code of Conduct.










        draft saved

        draft discarded


















        StackExchange.ready(
        function () {
        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f503830%2fchecking-for-the-existence-of-multiple-directories%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









        6














        If you already expect them to be directories and are just checking whether they all exist, you could use the exit code from the ls utility to determine whether one or more "errors occurred":



        ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir3" >/dev/null 2>&1 && echo All there


        I redirect the output and stderr to /dev/null in order to make it disappear, since we only care about the exit code from ls, not its output. Anything that's written to /dev/null disappears — it is not written to your terminal.






        share|improve this answer


























        • Can you help me understand this command? I know what file descriptors are. I know 1 is stdout, 2 is stderr and I know what redirecting is. I don't understand the significance of /dev/null, and I do not know how to parse the command.

          – Elegance
          10 hours ago











        • @Elegance I added a little explanation. For more in-depth answers regarding /dev/null, see unix.stackexchange.com/questions/163352/… and unix.stackexchange.com/questions/438130/…

          – Jeff Schaller
          10 hours ago











        • Still trying to figure out how the syntax works. I read that &>filename redirects both stdout and stderr to filename. So couldn't the command be simplified (at least to me it is more simple) as ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir2" &>/dev/null && echo All there?

          – Elegance
          10 hours ago








        • 1





          I got it finally. Thanks.

          – Elegance
          10 hours ago






        • 1





          (1) You should probably use the -d option (a) so ls needs only to stat the directories, and not read them, and (b) so the command will succeed even if the user doesn’t have read access to the directories.  (2) I don’t see any reason to use "$PWD/" except to guard against directories whose names begin with - (and, of course, there are better ways to do that).

          – G-Man
          2 hours ago
















        6














        If you already expect them to be directories and are just checking whether they all exist, you could use the exit code from the ls utility to determine whether one or more "errors occurred":



        ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir3" >/dev/null 2>&1 && echo All there


        I redirect the output and stderr to /dev/null in order to make it disappear, since we only care about the exit code from ls, not its output. Anything that's written to /dev/null disappears — it is not written to your terminal.






        share|improve this answer


























        • Can you help me understand this command? I know what file descriptors are. I know 1 is stdout, 2 is stderr and I know what redirecting is. I don't understand the significance of /dev/null, and I do not know how to parse the command.

          – Elegance
          10 hours ago











        • @Elegance I added a little explanation. For more in-depth answers regarding /dev/null, see unix.stackexchange.com/questions/163352/… and unix.stackexchange.com/questions/438130/…

          – Jeff Schaller
          10 hours ago











        • Still trying to figure out how the syntax works. I read that &>filename redirects both stdout and stderr to filename. So couldn't the command be simplified (at least to me it is more simple) as ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir2" &>/dev/null && echo All there?

          – Elegance
          10 hours ago








        • 1





          I got it finally. Thanks.

          – Elegance
          10 hours ago






        • 1





          (1) You should probably use the -d option (a) so ls needs only to stat the directories, and not read them, and (b) so the command will succeed even if the user doesn’t have read access to the directories.  (2) I don’t see any reason to use "$PWD/" except to guard against directories whose names begin with - (and, of course, there are better ways to do that).

          – G-Man
          2 hours ago














        6












        6








        6







        If you already expect them to be directories and are just checking whether they all exist, you could use the exit code from the ls utility to determine whether one or more "errors occurred":



        ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir3" >/dev/null 2>&1 && echo All there


        I redirect the output and stderr to /dev/null in order to make it disappear, since we only care about the exit code from ls, not its output. Anything that's written to /dev/null disappears — it is not written to your terminal.






        share|improve this answer















        If you already expect them to be directories and are just checking whether they all exist, you could use the exit code from the ls utility to determine whether one or more "errors occurred":



        ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir3" >/dev/null 2>&1 && echo All there


        I redirect the output and stderr to /dev/null in order to make it disappear, since we only care about the exit code from ls, not its output. Anything that's written to /dev/null disappears — it is not written to your terminal.







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 2 hours ago









        G-Man

        13.2k93566




        13.2k93566










        answered 12 hours ago









        Jeff SchallerJeff Schaller

        42.8k1159136




        42.8k1159136













        • Can you help me understand this command? I know what file descriptors are. I know 1 is stdout, 2 is stderr and I know what redirecting is. I don't understand the significance of /dev/null, and I do not know how to parse the command.

          – Elegance
          10 hours ago











        • @Elegance I added a little explanation. For more in-depth answers regarding /dev/null, see unix.stackexchange.com/questions/163352/… and unix.stackexchange.com/questions/438130/…

          – Jeff Schaller
          10 hours ago











        • Still trying to figure out how the syntax works. I read that &>filename redirects both stdout and stderr to filename. So couldn't the command be simplified (at least to me it is more simple) as ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir2" &>/dev/null && echo All there?

          – Elegance
          10 hours ago








        • 1





          I got it finally. Thanks.

          – Elegance
          10 hours ago






        • 1





          (1) You should probably use the -d option (a) so ls needs only to stat the directories, and not read them, and (b) so the command will succeed even if the user doesn’t have read access to the directories.  (2) I don’t see any reason to use "$PWD/" except to guard against directories whose names begin with - (and, of course, there are better ways to do that).

          – G-Man
          2 hours ago



















        • Can you help me understand this command? I know what file descriptors are. I know 1 is stdout, 2 is stderr and I know what redirecting is. I don't understand the significance of /dev/null, and I do not know how to parse the command.

          – Elegance
          10 hours ago











        • @Elegance I added a little explanation. For more in-depth answers regarding /dev/null, see unix.stackexchange.com/questions/163352/… and unix.stackexchange.com/questions/438130/…

          – Jeff Schaller
          10 hours ago











        • Still trying to figure out how the syntax works. I read that &>filename redirects both stdout and stderr to filename. So couldn't the command be simplified (at least to me it is more simple) as ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir2" &>/dev/null && echo All there?

          – Elegance
          10 hours ago








        • 1





          I got it finally. Thanks.

          – Elegance
          10 hours ago






        • 1





          (1) You should probably use the -d option (a) so ls needs only to stat the directories, and not read them, and (b) so the command will succeed even if the user doesn’t have read access to the directories.  (2) I don’t see any reason to use "$PWD/" except to guard against directories whose names begin with - (and, of course, there are better ways to do that).

          – G-Man
          2 hours ago

















        Can you help me understand this command? I know what file descriptors are. I know 1 is stdout, 2 is stderr and I know what redirecting is. I don't understand the significance of /dev/null, and I do not know how to parse the command.

        – Elegance
        10 hours ago





        Can you help me understand this command? I know what file descriptors are. I know 1 is stdout, 2 is stderr and I know what redirecting is. I don't understand the significance of /dev/null, and I do not know how to parse the command.

        – Elegance
        10 hours ago













        @Elegance I added a little explanation. For more in-depth answers regarding /dev/null, see unix.stackexchange.com/questions/163352/… and unix.stackexchange.com/questions/438130/…

        – Jeff Schaller
        10 hours ago





        @Elegance I added a little explanation. For more in-depth answers regarding /dev/null, see unix.stackexchange.com/questions/163352/… and unix.stackexchange.com/questions/438130/…

        – Jeff Schaller
        10 hours ago













        Still trying to figure out how the syntax works. I read that &>filename redirects both stdout and stderr to filename. So couldn't the command be simplified (at least to me it is more simple) as ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir2" &>/dev/null && echo All there?

        – Elegance
        10 hours ago







        Still trying to figure out how the syntax works. I read that &>filename redirects both stdout and stderr to filename. So couldn't the command be simplified (at least to me it is more simple) as ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir2" &>/dev/null && echo All there?

        – Elegance
        10 hours ago






        1




        1





        I got it finally. Thanks.

        – Elegance
        10 hours ago





        I got it finally. Thanks.

        – Elegance
        10 hours ago




        1




        1





        (1) You should probably use the -d option (a) so ls needs only to stat the directories, and not read them, and (b) so the command will succeed even if the user doesn’t have read access to the directories.  (2) I don’t see any reason to use "$PWD/" except to guard against directories whose names begin with - (and, of course, there are better ways to do that).

        – G-Man
        2 hours ago





        (1) You should probably use the -d option (a) so ls needs only to stat the directories, and not read them, and (b) so the command will succeed even if the user doesn’t have read access to the directories.  (2) I don’t see any reason to use "$PWD/" except to guard against directories whose names begin with - (and, of course, there are better ways to do that).

        – G-Man
        2 hours ago













        8














        I would loop:



        result=True
        for dir in
        "$PWD/dir1"
        "$PWD/dir2"
        "$PWD/dir3"
        do
        if ! [ -d "$dir" ]; then
        result=False
        break
        fi
        done
        echo "$result"


        The break causes the loop to short-circuit, just like your chain of &&






        share|improve this answer




























          8














          I would loop:



          result=True
          for dir in
          "$PWD/dir1"
          "$PWD/dir2"
          "$PWD/dir3"
          do
          if ! [ -d "$dir" ]; then
          result=False
          break
          fi
          done
          echo "$result"


          The break causes the loop to short-circuit, just like your chain of &&






          share|improve this answer


























            8












            8








            8







            I would loop:



            result=True
            for dir in
            "$PWD/dir1"
            "$PWD/dir2"
            "$PWD/dir3"
            do
            if ! [ -d "$dir" ]; then
            result=False
            break
            fi
            done
            echo "$result"


            The break causes the loop to short-circuit, just like your chain of &&






            share|improve this answer













            I would loop:



            result=True
            for dir in
            "$PWD/dir1"
            "$PWD/dir2"
            "$PWD/dir3"
            do
            if ! [ -d "$dir" ]; then
            result=False
            break
            fi
            done
            echo "$result"


            The break causes the loop to short-circuit, just like your chain of &&







            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered 12 hours ago









            glenn jackmanglenn jackman

            52.1k572112




            52.1k572112























                4














                A loop might be more elegant:



                arr=("$PWD/dir1" "$PWD/dir2" "$PWD/dir2")
                for d in "${arr[@]}"; do
                if [ -d "$d"]; then
                echo True
                else
                echo False
                fi
                done


                This is Bash. A more portable one is Sh. There you can use the positional array:



                set -- "$PWD/dir1" "$PWD/dir2" "$PWD/dir2"


                Then to loop over it use "$@".






                share|improve this answer






























                  4














                  A loop might be more elegant:



                  arr=("$PWD/dir1" "$PWD/dir2" "$PWD/dir2")
                  for d in "${arr[@]}"; do
                  if [ -d "$d"]; then
                  echo True
                  else
                  echo False
                  fi
                  done


                  This is Bash. A more portable one is Sh. There you can use the positional array:



                  set -- "$PWD/dir1" "$PWD/dir2" "$PWD/dir2"


                  Then to loop over it use "$@".






                  share|improve this answer




























                    4












                    4








                    4







                    A loop might be more elegant:



                    arr=("$PWD/dir1" "$PWD/dir2" "$PWD/dir2")
                    for d in "${arr[@]}"; do
                    if [ -d "$d"]; then
                    echo True
                    else
                    echo False
                    fi
                    done


                    This is Bash. A more portable one is Sh. There you can use the positional array:



                    set -- "$PWD/dir1" "$PWD/dir2" "$PWD/dir2"


                    Then to loop over it use "$@".






                    share|improve this answer















                    A loop might be more elegant:



                    arr=("$PWD/dir1" "$PWD/dir2" "$PWD/dir2")
                    for d in "${arr[@]}"; do
                    if [ -d "$d"]; then
                    echo True
                    else
                    echo False
                    fi
                    done


                    This is Bash. A more portable one is Sh. There you can use the positional array:



                    set -- "$PWD/dir1" "$PWD/dir2" "$PWD/dir2"


                    Then to loop over it use "$@".







                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited 12 hours ago

























                    answered 12 hours ago









                    TomaszTomasz

                    9,86652966




                    9,86652966























                        1














                        Why not just:



                        if [ -d "dir1" -a -d "dir2" -a -d "dir3" ]; then
                        echo True
                        else
                        echo False
                        fi





                        share|improve this answer
























                        • This is essentially what the OP started with, But I suspect there is a more elegant way of doing this

                          – Jeff Schaller
                          8 hours ago






                        • 2





                          Also POSIX discourages the use of -a: "-a and -o binary primaries (...) operators have been marked obsolescent": pubs.opengroup.org/onlinepubs/9699919799

                          – Elegance
                          8 hours ago













                        • @JeffSchaller It's more terse since it does it all in one call to test.

                          – David Conrad
                          5 hours ago











                        • @Elegance They're still supported on all the systems I use, and probably will be a hundred years from now.

                          – David Conrad
                          5 hours ago
















                        1














                        Why not just:



                        if [ -d "dir1" -a -d "dir2" -a -d "dir3" ]; then
                        echo True
                        else
                        echo False
                        fi





                        share|improve this answer
























                        • This is essentially what the OP started with, But I suspect there is a more elegant way of doing this

                          – Jeff Schaller
                          8 hours ago






                        • 2





                          Also POSIX discourages the use of -a: "-a and -o binary primaries (...) operators have been marked obsolescent": pubs.opengroup.org/onlinepubs/9699919799

                          – Elegance
                          8 hours ago













                        • @JeffSchaller It's more terse since it does it all in one call to test.

                          – David Conrad
                          5 hours ago











                        • @Elegance They're still supported on all the systems I use, and probably will be a hundred years from now.

                          – David Conrad
                          5 hours ago














                        1












                        1








                        1







                        Why not just:



                        if [ -d "dir1" -a -d "dir2" -a -d "dir3" ]; then
                        echo True
                        else
                        echo False
                        fi





                        share|improve this answer













                        Why not just:



                        if [ -d "dir1" -a -d "dir2" -a -d "dir3" ]; then
                        echo True
                        else
                        echo False
                        fi






                        share|improve this answer












                        share|improve this answer



                        share|improve this answer










                        answered 9 hours ago









                        David ConradDavid Conrad

                        1414




                        1414













                        • This is essentially what the OP started with, But I suspect there is a more elegant way of doing this

                          – Jeff Schaller
                          8 hours ago






                        • 2





                          Also POSIX discourages the use of -a: "-a and -o binary primaries (...) operators have been marked obsolescent": pubs.opengroup.org/onlinepubs/9699919799

                          – Elegance
                          8 hours ago













                        • @JeffSchaller It's more terse since it does it all in one call to test.

                          – David Conrad
                          5 hours ago











                        • @Elegance They're still supported on all the systems I use, and probably will be a hundred years from now.

                          – David Conrad
                          5 hours ago



















                        • This is essentially what the OP started with, But I suspect there is a more elegant way of doing this

                          – Jeff Schaller
                          8 hours ago






                        • 2





                          Also POSIX discourages the use of -a: "-a and -o binary primaries (...) operators have been marked obsolescent": pubs.opengroup.org/onlinepubs/9699919799

                          – Elegance
                          8 hours ago













                        • @JeffSchaller It's more terse since it does it all in one call to test.

                          – David Conrad
                          5 hours ago











                        • @Elegance They're still supported on all the systems I use, and probably will be a hundred years from now.

                          – David Conrad
                          5 hours ago

















                        This is essentially what the OP started with, But I suspect there is a more elegant way of doing this

                        – Jeff Schaller
                        8 hours ago





                        This is essentially what the OP started with, But I suspect there is a more elegant way of doing this

                        – Jeff Schaller
                        8 hours ago




                        2




                        2





                        Also POSIX discourages the use of -a: "-a and -o binary primaries (...) operators have been marked obsolescent": pubs.opengroup.org/onlinepubs/9699919799

                        – Elegance
                        8 hours ago







                        Also POSIX discourages the use of -a: "-a and -o binary primaries (...) operators have been marked obsolescent": pubs.opengroup.org/onlinepubs/9699919799

                        – Elegance
                        8 hours ago















                        @JeffSchaller It's more terse since it does it all in one call to test.

                        – David Conrad
                        5 hours ago





                        @JeffSchaller It's more terse since it does it all in one call to test.

                        – David Conrad
                        5 hours ago













                        @Elegance They're still supported on all the systems I use, and probably will be a hundred years from now.

                        – David Conrad
                        5 hours ago





                        @Elegance They're still supported on all the systems I use, and probably will be a hundred years from now.

                        – David Conrad
                        5 hours ago











                        0















                        The goal is to check for the existence of a few directories
                        and for the nonexistence of others. 
                        [Emphasis added]




                        Building on glenn jackman’s answer,
                        we can test for the nonexistence of other names like this:


                        result=True
                        for dir in
                        "$PWD/dir1"
                        "$PWD/dir2"
                        "$PWD/dir3"
                        do
                        if ! [ -d "$dir" ]; then
                        result=False
                        break
                        fi
                        done
                        for dir in
                        "$PWD/dir4"
                        "$PWD/dir5"
                        "$PWD/dir6"
                        do
                        if [ -e "$dir" ]; then # Note: no “!”
                        result=False
                        break
                        fi
                        done

                        echo "$result"

                        I used [ -e "$dir" ] to test whether "$dir" exists;
                        i.e., if dir5 exists but is a file, the result is False
                        If you want only to test whether the names in the second group are directories,
                        use [ -d "$dir" ], like in the first loop.

                        Since we’re talking about checking for the existence of things
                        in the current working directory,
                        it’s probably not necessary to specify $PWD/ on the names; just do




                        for dir in 
                        "dir1"
                        "dir2"
                        "dir3"
                        do





                        share|improve this answer




























                          0















                          The goal is to check for the existence of a few directories
                          and for the nonexistence of others. 
                          [Emphasis added]




                          Building on glenn jackman’s answer,
                          we can test for the nonexistence of other names like this:


                          result=True
                          for dir in
                          "$PWD/dir1"
                          "$PWD/dir2"
                          "$PWD/dir3"
                          do
                          if ! [ -d "$dir" ]; then
                          result=False
                          break
                          fi
                          done
                          for dir in
                          "$PWD/dir4"
                          "$PWD/dir5"
                          "$PWD/dir6"
                          do
                          if [ -e "$dir" ]; then # Note: no “!”
                          result=False
                          break
                          fi
                          done

                          echo "$result"

                          I used [ -e "$dir" ] to test whether "$dir" exists;
                          i.e., if dir5 exists but is a file, the result is False
                          If you want only to test whether the names in the second group are directories,
                          use [ -d "$dir" ], like in the first loop.

                          Since we’re talking about checking for the existence of things
                          in the current working directory,
                          it’s probably not necessary to specify $PWD/ on the names; just do




                          for dir in 
                          "dir1"
                          "dir2"
                          "dir3"
                          do





                          share|improve this answer


























                            0












                            0








                            0








                            The goal is to check for the existence of a few directories
                            and for the nonexistence of others. 
                            [Emphasis added]




                            Building on glenn jackman’s answer,
                            we can test for the nonexistence of other names like this:


                            result=True
                            for dir in
                            "$PWD/dir1"
                            "$PWD/dir2"
                            "$PWD/dir3"
                            do
                            if ! [ -d "$dir" ]; then
                            result=False
                            break
                            fi
                            done
                            for dir in
                            "$PWD/dir4"
                            "$PWD/dir5"
                            "$PWD/dir6"
                            do
                            if [ -e "$dir" ]; then # Note: no “!”
                            result=False
                            break
                            fi
                            done

                            echo "$result"

                            I used [ -e "$dir" ] to test whether "$dir" exists;
                            i.e., if dir5 exists but is a file, the result is False
                            If you want only to test whether the names in the second group are directories,
                            use [ -d "$dir" ], like in the first loop.

                            Since we’re talking about checking for the existence of things
                            in the current working directory,
                            it’s probably not necessary to specify $PWD/ on the names; just do




                            for dir in 
                            "dir1"
                            "dir2"
                            "dir3"
                            do





                            share|improve this answer














                            The goal is to check for the existence of a few directories
                            and for the nonexistence of others. 
                            [Emphasis added]




                            Building on glenn jackman’s answer,
                            we can test for the nonexistence of other names like this:


                            result=True
                            for dir in
                            "$PWD/dir1"
                            "$PWD/dir2"
                            "$PWD/dir3"
                            do
                            if ! [ -d "$dir" ]; then
                            result=False
                            break
                            fi
                            done
                            for dir in
                            "$PWD/dir4"
                            "$PWD/dir5"
                            "$PWD/dir6"
                            do
                            if [ -e "$dir" ]; then # Note: no “!”
                            result=False
                            break
                            fi
                            done

                            echo "$result"

                            I used [ -e "$dir" ] to test whether "$dir" exists;
                            i.e., if dir5 exists but is a file, the result is False
                            If you want only to test whether the names in the second group are directories,
                            use [ -d "$dir" ], like in the first loop.

                            Since we’re talking about checking for the existence of things
                            in the current working directory,
                            it’s probably not necessary to specify $PWD/ on the names; just do




                            for dir in 
                            "dir1"
                            "dir2"
                            "dir3"
                            do






                            share|improve this answer












                            share|improve this answer



                            share|improve this answer










                            answered 1 hour ago









                            G-ManG-Man

                            13.2k93566




                            13.2k93566






















                                Elegance is a new contributor. Be nice, and check out our Code of Conduct.










                                draft saved

                                draft discarded


















                                Elegance is a new contributor. Be nice, and check out our Code of Conduct.













                                Elegance is a new contributor. Be nice, and check out our Code of Conduct.












                                Elegance is a new contributor. Be nice, and check out our Code of Conduct.
















                                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.




                                draft saved


                                draft discarded














                                StackExchange.ready(
                                function () {
                                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f503830%2fchecking-for-the-existence-of-multiple-directories%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

                                If I really need a card on my start hand, how many mulligans make sense? [duplicate]

                                Alcedinidae

                                Can an atomic nucleus contain both particles and antiparticles? [duplicate]