How can I read all the files with a similar pattern in a folder and pass them as a comma separated string to...












0















I have this bash file:



#!/bin/bash

some_code.py -i 1_xxx.txt,2_xxx.txt,...,10_xxx.txt -o something.txt


The list "1_xxx.txt,2_xxx.txt,...,10_xxx.txt" contains the names of the files in the folder that have xxx in common.



The input to some_code.py must come after -i in the form of the file names separated by comma with no spacing.



My question is: how can I echo the filenames (with xxx) into a comma separated string and pass it to my Python code?










share|improve this question





























    0















    I have this bash file:



    #!/bin/bash

    some_code.py -i 1_xxx.txt,2_xxx.txt,...,10_xxx.txt -o something.txt


    The list "1_xxx.txt,2_xxx.txt,...,10_xxx.txt" contains the names of the files in the folder that have xxx in common.



    The input to some_code.py must come after -i in the form of the file names separated by comma with no spacing.



    My question is: how can I echo the filenames (with xxx) into a comma separated string and pass it to my Python code?










    share|improve this question



























      0












      0








      0








      I have this bash file:



      #!/bin/bash

      some_code.py -i 1_xxx.txt,2_xxx.txt,...,10_xxx.txt -o something.txt


      The list "1_xxx.txt,2_xxx.txt,...,10_xxx.txt" contains the names of the files in the folder that have xxx in common.



      The input to some_code.py must come after -i in the form of the file names separated by comma with no spacing.



      My question is: how can I echo the filenames (with xxx) into a comma separated string and pass it to my Python code?










      share|improve this question
















      I have this bash file:



      #!/bin/bash

      some_code.py -i 1_xxx.txt,2_xxx.txt,...,10_xxx.txt -o something.txt


      The list "1_xxx.txt,2_xxx.txt,...,10_xxx.txt" contains the names of the files in the folder that have xxx in common.



      The input to some_code.py must come after -i in the form of the file names separated by comma with no spacing.



      My question is: how can I echo the filenames (with xxx) into a comma separated string and pass it to my Python code?







      bash echo






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 20 '18 at 19:22







      Theoden

















      asked Nov 20 '18 at 18:41









      TheodenTheoden

      529




      529
























          2 Answers
          2






          active

          oldest

          votes


















          1














          You could use command substitution and set IFS to ,. Assume you have



          $ ls
          1098_xxx.txt 20260_xxx.txt 22286_xxx.txt 32025_xxx.txt 6433_xxx.txt


          then you can do1



          echo "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")"


          resulting in



          1098_xxx.txt,20260_xxx.txt,22286_xxx.txt,32025_xxx.txt,6433_xxx.txt


          or, for your use case:



          some_code.py -i "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")" -o something.txt


          $(...) is command substitution, and ${f[*]} is a parameter expansion that uses the first character from IFS as the element separator.



          This should be save for file names containing any character, including spaces and glob characters; if you have hidden files (starting with .), they'll be ignored, unless you set the shopt -s dotglob shell option.



          Also, if you potentially have no files matching *xxx*, you could set shopt -s nullglob to prevent creating a file that's literally called *xxx*.





          1echo "$(cmd)" is usually an anti-pattern to be replaced by just cmd; I'm using it here with echo as a placeholder for other commands. Using command substitution also has the benefit of changing IFS only there and not in the parent shell.






          share|improve this answer


























          • Thanks. It does exactly what I need.

            – Theoden
            Nov 20 '18 at 19:07











          • @Amessihel Good point, actually - that could be messed up when filenames start with -. Should use printf!

            – Benjamin W.
            Nov 20 '18 at 19:34



















          0














          If you insist on the exact format, you can do it with with bash loops:



          f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done


          This will generate string:



          1_xxx.txt,2_xxx.txt,...,10_xxx.txt,


          Now if you want to remove the last , use sed s'/.$//', pipe it like this:



          f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done | sed s'/.$//'


          This will generate the string that you're after. You can then wrap a () around it for use within your bash command.






          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            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%2fstackoverflow.com%2fquestions%2f53399481%2fhow-can-i-read-all-the-files-with-a-similar-pattern-in-a-folder-and-pass-them-as%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









            1














            You could use command substitution and set IFS to ,. Assume you have



            $ ls
            1098_xxx.txt 20260_xxx.txt 22286_xxx.txt 32025_xxx.txt 6433_xxx.txt


            then you can do1



            echo "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")"


            resulting in



            1098_xxx.txt,20260_xxx.txt,22286_xxx.txt,32025_xxx.txt,6433_xxx.txt


            or, for your use case:



            some_code.py -i "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")" -o something.txt


            $(...) is command substitution, and ${f[*]} is a parameter expansion that uses the first character from IFS as the element separator.



            This should be save for file names containing any character, including spaces and glob characters; if you have hidden files (starting with .), they'll be ignored, unless you set the shopt -s dotglob shell option.



            Also, if you potentially have no files matching *xxx*, you could set shopt -s nullglob to prevent creating a file that's literally called *xxx*.





            1echo "$(cmd)" is usually an anti-pattern to be replaced by just cmd; I'm using it here with echo as a placeholder for other commands. Using command substitution also has the benefit of changing IFS only there and not in the parent shell.






            share|improve this answer


























            • Thanks. It does exactly what I need.

              – Theoden
              Nov 20 '18 at 19:07











            • @Amessihel Good point, actually - that could be messed up when filenames start with -. Should use printf!

              – Benjamin W.
              Nov 20 '18 at 19:34
















            1














            You could use command substitution and set IFS to ,. Assume you have



            $ ls
            1098_xxx.txt 20260_xxx.txt 22286_xxx.txt 32025_xxx.txt 6433_xxx.txt


            then you can do1



            echo "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")"


            resulting in



            1098_xxx.txt,20260_xxx.txt,22286_xxx.txt,32025_xxx.txt,6433_xxx.txt


            or, for your use case:



            some_code.py -i "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")" -o something.txt


            $(...) is command substitution, and ${f[*]} is a parameter expansion that uses the first character from IFS as the element separator.



            This should be save for file names containing any character, including spaces and glob characters; if you have hidden files (starting with .), they'll be ignored, unless you set the shopt -s dotglob shell option.



            Also, if you potentially have no files matching *xxx*, you could set shopt -s nullglob to prevent creating a file that's literally called *xxx*.





            1echo "$(cmd)" is usually an anti-pattern to be replaced by just cmd; I'm using it here with echo as a placeholder for other commands. Using command substitution also has the benefit of changing IFS only there and not in the parent shell.






            share|improve this answer


























            • Thanks. It does exactly what I need.

              – Theoden
              Nov 20 '18 at 19:07











            • @Amessihel Good point, actually - that could be messed up when filenames start with -. Should use printf!

              – Benjamin W.
              Nov 20 '18 at 19:34














            1












            1








            1







            You could use command substitution and set IFS to ,. Assume you have



            $ ls
            1098_xxx.txt 20260_xxx.txt 22286_xxx.txt 32025_xxx.txt 6433_xxx.txt


            then you can do1



            echo "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")"


            resulting in



            1098_xxx.txt,20260_xxx.txt,22286_xxx.txt,32025_xxx.txt,6433_xxx.txt


            or, for your use case:



            some_code.py -i "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")" -o something.txt


            $(...) is command substitution, and ${f[*]} is a parameter expansion that uses the first character from IFS as the element separator.



            This should be save for file names containing any character, including spaces and glob characters; if you have hidden files (starting with .), they'll be ignored, unless you set the shopt -s dotglob shell option.



            Also, if you potentially have no files matching *xxx*, you could set shopt -s nullglob to prevent creating a file that's literally called *xxx*.





            1echo "$(cmd)" is usually an anti-pattern to be replaced by just cmd; I'm using it here with echo as a placeholder for other commands. Using command substitution also has the benefit of changing IFS only there and not in the parent shell.






            share|improve this answer















            You could use command substitution and set IFS to ,. Assume you have



            $ ls
            1098_xxx.txt 20260_xxx.txt 22286_xxx.txt 32025_xxx.txt 6433_xxx.txt


            then you can do1



            echo "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")"


            resulting in



            1098_xxx.txt,20260_xxx.txt,22286_xxx.txt,32025_xxx.txt,6433_xxx.txt


            or, for your use case:



            some_code.py -i "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")" -o something.txt


            $(...) is command substitution, and ${f[*]} is a parameter expansion that uses the first character from IFS as the element separator.



            This should be save for file names containing any character, including spaces and glob characters; if you have hidden files (starting with .), they'll be ignored, unless you set the shopt -s dotglob shell option.



            Also, if you potentially have no files matching *xxx*, you could set shopt -s nullglob to prevent creating a file that's literally called *xxx*.





            1echo "$(cmd)" is usually an anti-pattern to be replaced by just cmd; I'm using it here with echo as a placeholder for other commands. Using command substitution also has the benefit of changing IFS only there and not in the parent shell.







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Nov 20 '18 at 19:35

























            answered Nov 20 '18 at 18:59









            Benjamin W.Benjamin W.

            20.6k134856




            20.6k134856













            • Thanks. It does exactly what I need.

              – Theoden
              Nov 20 '18 at 19:07











            • @Amessihel Good point, actually - that could be messed up when filenames start with -. Should use printf!

              – Benjamin W.
              Nov 20 '18 at 19:34



















            • Thanks. It does exactly what I need.

              – Theoden
              Nov 20 '18 at 19:07











            • @Amessihel Good point, actually - that could be messed up when filenames start with -. Should use printf!

              – Benjamin W.
              Nov 20 '18 at 19:34

















            Thanks. It does exactly what I need.

            – Theoden
            Nov 20 '18 at 19:07





            Thanks. It does exactly what I need.

            – Theoden
            Nov 20 '18 at 19:07













            @Amessihel Good point, actually - that could be messed up when filenames start with -. Should use printf!

            – Benjamin W.
            Nov 20 '18 at 19:34





            @Amessihel Good point, actually - that could be messed up when filenames start with -. Should use printf!

            – Benjamin W.
            Nov 20 '18 at 19:34













            0














            If you insist on the exact format, you can do it with with bash loops:



            f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done


            This will generate string:



            1_xxx.txt,2_xxx.txt,...,10_xxx.txt,


            Now if you want to remove the last , use sed s'/.$//', pipe it like this:



            f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done | sed s'/.$//'


            This will generate the string that you're after. You can then wrap a () around it for use within your bash command.






            share|improve this answer




























              0














              If you insist on the exact format, you can do it with with bash loops:



              f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done


              This will generate string:



              1_xxx.txt,2_xxx.txt,...,10_xxx.txt,


              Now if you want to remove the last , use sed s'/.$//', pipe it like this:



              f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done | sed s'/.$//'


              This will generate the string that you're after. You can then wrap a () around it for use within your bash command.






              share|improve this answer


























                0












                0








                0







                If you insist on the exact format, you can do it with with bash loops:



                f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done


                This will generate string:



                1_xxx.txt,2_xxx.txt,...,10_xxx.txt,


                Now if you want to remove the last , use sed s'/.$//', pipe it like this:



                f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done | sed s'/.$//'


                This will generate the string that you're after. You can then wrap a () around it for use within your bash command.






                share|improve this answer













                If you insist on the exact format, you can do it with with bash loops:



                f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done


                This will generate string:



                1_xxx.txt,2_xxx.txt,...,10_xxx.txt,


                Now if you want to remove the last , use sed s'/.$//', pipe it like this:



                f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done | sed s'/.$//'


                This will generate the string that you're after. You can then wrap a () around it for use within your bash command.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 20 '18 at 18:51









                Rocky LiRocky Li

                2,8731316




                2,8731316






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • 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%2fstackoverflow.com%2fquestions%2f53399481%2fhow-can-i-read-all-the-files-with-a-similar-pattern-in-a-folder-and-pass-them-as%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

                    MongoDB - Not Authorized To Execute Command

                    in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith

                    Npm cannot find a required file even through it is in the searched directory