Just one file echoed from an array of filescp in multi line fashionparse one field from an JSON array into bash arrayBash Shell Script Array Length Off By OneArray from piped commands failscp from different directory to one directory certain filesbash script load an modify array from external file

How to use the passive form to say "This flower was watered."

Virtual destructor moves object out of rodata section

Will some rockets really collapse under their own weight?

Would getting a natural 20 with a penalty still count as a critical hit?

Do banks' profitability really suffer under low interest rates

Designing a prison for a telekinetic race

Why was ramjet fuel used as hydraulic fluid during Saturn V checkout?

My father gets angry everytime I pass Salam, that means I should stop saying Salam when he's around?

What's the point of writing that I know will never be used or read?

Tabularx with hline and overrightarrow vertical spacing

9 hrs long transit in DEL

Show two plots together: a two dimensional curve tangent to the maxima of a three dimensional plot

Reducing contention in thread-safe LruCache

Gofer work in exchange for Letter of Recommendation

What security risks does exposing the size of the plaintext entail?

Why did St. Jerome use "virago" in Gen. 2:23?

What is bodily formation? Does it refer to the breath or the body?

Just one file echoed from an array of files

What causes burn marks on the air handler in the attic?

Check disk usage of files returned with spaces

Can 'in-' mean both 'in' and 'no'?

Is there a way to make the "o" keypress of other-window <C-x><C-o> repeatable?

Why don't modern jet engines use forced exhaust mixing?

Can I check a small array of bools in one go?



Just one file echoed from an array of files


cp in multi line fashionparse one field from an JSON array into bash arrayBash Shell Script Array Length Off By OneArray from piped commands failscp from different directory to one directory certain filesbash script load an modify array from external file






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








3















I try to copy 2 or more files from one directory to another with cp using an array.

I executed:



files=(
LocalSettings.php
robots.txt
.htaccess
$domain.png
googlec69e044fede13fdc.htm
)


filenames indented with tabulations;



I aim to execute afterwards:



cp -a "source_path/$files[@]" "/destanation_path"


my problem is that while testing the variable itself,
echo $files returned only the first filename LocalSettings.php and not the full list of files.

How would you explain this?

Related: cp in multi line fashion;










share|improve this question


























  • Note how I, in my answer to the related question, use cd to change to the source directory before copying. If I didn't do that, I would have to specify the full path to the files in the list, e.g. source_path/LocalSottings.php source_path/robots.txt etc. Also $files would always be the same as $files[0].

    – Kusalananda
    11 hours ago


















3















I try to copy 2 or more files from one directory to another with cp using an array.

I executed:



files=(
LocalSettings.php
robots.txt
.htaccess
$domain.png
googlec69e044fede13fdc.htm
)


filenames indented with tabulations;



I aim to execute afterwards:



cp -a "source_path/$files[@]" "/destanation_path"


my problem is that while testing the variable itself,
echo $files returned only the first filename LocalSettings.php and not the full list of files.

How would you explain this?

Related: cp in multi line fashion;










share|improve this question


























  • Note how I, in my answer to the related question, use cd to change to the source directory before copying. If I didn't do that, I would have to specify the full path to the files in the list, e.g. source_path/LocalSottings.php source_path/robots.txt etc. Also $files would always be the same as $files[0].

    – Kusalananda
    11 hours ago














3












3








3








I try to copy 2 or more files from one directory to another with cp using an array.

I executed:



files=(
LocalSettings.php
robots.txt
.htaccess
$domain.png
googlec69e044fede13fdc.htm
)


filenames indented with tabulations;



I aim to execute afterwards:



cp -a "source_path/$files[@]" "/destanation_path"


my problem is that while testing the variable itself,
echo $files returned only the first filename LocalSettings.php and not the full list of files.

How would you explain this?

Related: cp in multi line fashion;










share|improve this question
















I try to copy 2 or more files from one directory to another with cp using an array.

I executed:



files=(
LocalSettings.php
robots.txt
.htaccess
$domain.png
googlec69e044fede13fdc.htm
)


filenames indented with tabulations;



I aim to execute afterwards:



cp -a "source_path/$files[@]" "/destanation_path"


my problem is that while testing the variable itself,
echo $files returned only the first filename LocalSettings.php and not the full list of files.

How would you explain this?

Related: cp in multi line fashion;







bash ksh cp array






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 7 hours ago









Gilles

570k136 gold badges1175 silver badges1687 bronze badges




570k136 gold badges1175 silver badges1687 bronze badges










asked 12 hours ago









JohnDoeaJohnDoea

241 gold badge11 silver badges46 bronze badges




241 gold badge11 silver badges46 bronze badges















  • Note how I, in my answer to the related question, use cd to change to the source directory before copying. If I didn't do that, I would have to specify the full path to the files in the list, e.g. source_path/LocalSottings.php source_path/robots.txt etc. Also $files would always be the same as $files[0].

    – Kusalananda
    11 hours ago


















  • Note how I, in my answer to the related question, use cd to change to the source directory before copying. If I didn't do that, I would have to specify the full path to the files in the list, e.g. source_path/LocalSottings.php source_path/robots.txt etc. Also $files would always be the same as $files[0].

    – Kusalananda
    11 hours ago

















Note how I, in my answer to the related question, use cd to change to the source directory before copying. If I didn't do that, I would have to specify the full path to the files in the list, e.g. source_path/LocalSottings.php source_path/robots.txt etc. Also $files would always be the same as $files[0].

– Kusalananda
11 hours ago






Note how I, in my answer to the related question, use cd to change to the source directory before copying. If I didn't do that, I would have to specify the full path to the files in the list, e.g. source_path/LocalSottings.php source_path/robots.txt etc. Also $files would always be the same as $files[0].

– Kusalananda
11 hours ago











4 Answers
4






active

oldest

votes


















4














It's Bash feature described in man bash:




Referencing an array variable without a subscript is equivalent to
referencing the array with a subscript of 0.




If you want to print all members of files array:



echo "$files[@]"


Also described in man bash:




$name[@] expands each element of name to a separate word.







share|improve this answer
































    3














    $files and $files[0] is equivalent when files is a list such as the one you have in your question.



    Note that "source_path/$files[@]" only puts source_path/ before the first element of the list.
    To modify the list in such a way that each element is prefixed by some path, you can do



    files=( ... your list of files ... )

    for element in "$files[@]"; do
    files=( "$files[@]:1" "source_path/$element" )
    done

    cp "$files[@]" destanation_path


    or, you could just cd to source_path before doing the cp, or add the path to the actual names at the same time as you assign the values in the list from the start.






    share|improve this answer


































      0














      As others have pointed out, $files only expands to the first element of the array, and "source_path/$files[@]" only attaches "source_path/" to the first element. But there's a relatively simple way to get all elements, with a path prepended to each:



      cp -a "$files[@]/#/source_path/" "/destanation_path"


      This combines the all-elements expansion ([@]) with a substitution. /# means "replace at beginning of string", then the empty string to replace, then / to delimit the replacement, then "source_path/" as the thing to replace (/add). This attaches the source path to each element, and doesn't get confused by funny characters in the elements like some versions do.



      Note that in the above example, "source_path/" has a slash at the end but not the beginning; the "/" right before it is a delimiter. If it started with a slash and contained more slashes, like "/source/path/", it'd still work:



      cp -a "$files[@]/#//source/path/" "/destanation_path"





      share|improve this answer
































        -1














        You can also try the following snippet:



        IFS=$'n'
        cp -a $( printf "source_path/%sn" "$files[@]" ) /destination_path/


        It should also work with filenames with spaces.






        share|improve this answer

























        • It works with file names containing spaces, but not with file names containing newlines or wildcards. It's also completely pointless, since cp -a "$files[@]" /destination_path/ works strictly better.

          – Gilles
          7 hours ago













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



        );













        draft saved

        draft discarded


















        StackExchange.ready(
        function ()
        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f536125%2fjust-one-file-echoed-from-an-array-of-files%23new-answer', 'question_page');

        );

        Post as a guest















        Required, but never shown

























        4 Answers
        4






        active

        oldest

        votes








        4 Answers
        4






        active

        oldest

        votes









        active

        oldest

        votes






        active

        oldest

        votes









        4














        It's Bash feature described in man bash:




        Referencing an array variable without a subscript is equivalent to
        referencing the array with a subscript of 0.




        If you want to print all members of files array:



        echo "$files[@]"


        Also described in man bash:




        $name[@] expands each element of name to a separate word.







        share|improve this answer





























          4














          It's Bash feature described in man bash:




          Referencing an array variable without a subscript is equivalent to
          referencing the array with a subscript of 0.




          If you want to print all members of files array:



          echo "$files[@]"


          Also described in man bash:




          $name[@] expands each element of name to a separate word.







          share|improve this answer



























            4












            4








            4







            It's Bash feature described in man bash:




            Referencing an array variable without a subscript is equivalent to
            referencing the array with a subscript of 0.




            If you want to print all members of files array:



            echo "$files[@]"


            Also described in man bash:




            $name[@] expands each element of name to a separate word.







            share|improve this answer













            It's Bash feature described in man bash:




            Referencing an array variable without a subscript is equivalent to
            referencing the array with a subscript of 0.




            If you want to print all members of files array:



            echo "$files[@]"


            Also described in man bash:




            $name[@] expands each element of name to a separate word.








            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered 11 hours ago









            Arkadiusz DrabczykArkadiusz Drabczyk

            8,9253 gold badges20 silver badges36 bronze badges




            8,9253 gold badges20 silver badges36 bronze badges


























                3














                $files and $files[0] is equivalent when files is a list such as the one you have in your question.



                Note that "source_path/$files[@]" only puts source_path/ before the first element of the list.
                To modify the list in such a way that each element is prefixed by some path, you can do



                files=( ... your list of files ... )

                for element in "$files[@]"; do
                files=( "$files[@]:1" "source_path/$element" )
                done

                cp "$files[@]" destanation_path


                or, you could just cd to source_path before doing the cp, or add the path to the actual names at the same time as you assign the values in the list from the start.






                share|improve this answer































                  3














                  $files and $files[0] is equivalent when files is a list such as the one you have in your question.



                  Note that "source_path/$files[@]" only puts source_path/ before the first element of the list.
                  To modify the list in such a way that each element is prefixed by some path, you can do



                  files=( ... your list of files ... )

                  for element in "$files[@]"; do
                  files=( "$files[@]:1" "source_path/$element" )
                  done

                  cp "$files[@]" destanation_path


                  or, you could just cd to source_path before doing the cp, or add the path to the actual names at the same time as you assign the values in the list from the start.






                  share|improve this answer





























                    3












                    3








                    3







                    $files and $files[0] is equivalent when files is a list such as the one you have in your question.



                    Note that "source_path/$files[@]" only puts source_path/ before the first element of the list.
                    To modify the list in such a way that each element is prefixed by some path, you can do



                    files=( ... your list of files ... )

                    for element in "$files[@]"; do
                    files=( "$files[@]:1" "source_path/$element" )
                    done

                    cp "$files[@]" destanation_path


                    or, you could just cd to source_path before doing the cp, or add the path to the actual names at the same time as you assign the values in the list from the start.






                    share|improve this answer















                    $files and $files[0] is equivalent when files is a list such as the one you have in your question.



                    Note that "source_path/$files[@]" only puts source_path/ before the first element of the list.
                    To modify the list in such a way that each element is prefixed by some path, you can do



                    files=( ... your list of files ... )

                    for element in "$files[@]"; do
                    files=( "$files[@]:1" "source_path/$element" )
                    done

                    cp "$files[@]" destanation_path


                    or, you could just cd to source_path before doing the cp, or add the path to the actual names at the same time as you assign the values in the list from the start.







                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited 7 hours ago

























                    answered 8 hours ago









                    KusalanandaKusalananda

                    160k18 gold badges316 silver badges502 bronze badges




                    160k18 gold badges316 silver badges502 bronze badges
























                        0














                        As others have pointed out, $files only expands to the first element of the array, and "source_path/$files[@]" only attaches "source_path/" to the first element. But there's a relatively simple way to get all elements, with a path prepended to each:



                        cp -a "$files[@]/#/source_path/" "/destanation_path"


                        This combines the all-elements expansion ([@]) with a substitution. /# means "replace at beginning of string", then the empty string to replace, then / to delimit the replacement, then "source_path/" as the thing to replace (/add). This attaches the source path to each element, and doesn't get confused by funny characters in the elements like some versions do.



                        Note that in the above example, "source_path/" has a slash at the end but not the beginning; the "/" right before it is a delimiter. If it started with a slash and contained more slashes, like "/source/path/", it'd still work:



                        cp -a "$files[@]/#//source/path/" "/destanation_path"





                        share|improve this answer





























                          0














                          As others have pointed out, $files only expands to the first element of the array, and "source_path/$files[@]" only attaches "source_path/" to the first element. But there's a relatively simple way to get all elements, with a path prepended to each:



                          cp -a "$files[@]/#/source_path/" "/destanation_path"


                          This combines the all-elements expansion ([@]) with a substitution. /# means "replace at beginning of string", then the empty string to replace, then / to delimit the replacement, then "source_path/" as the thing to replace (/add). This attaches the source path to each element, and doesn't get confused by funny characters in the elements like some versions do.



                          Note that in the above example, "source_path/" has a slash at the end but not the beginning; the "/" right before it is a delimiter. If it started with a slash and contained more slashes, like "/source/path/", it'd still work:



                          cp -a "$files[@]/#//source/path/" "/destanation_path"





                          share|improve this answer



























                            0












                            0








                            0







                            As others have pointed out, $files only expands to the first element of the array, and "source_path/$files[@]" only attaches "source_path/" to the first element. But there's a relatively simple way to get all elements, with a path prepended to each:



                            cp -a "$files[@]/#/source_path/" "/destanation_path"


                            This combines the all-elements expansion ([@]) with a substitution. /# means "replace at beginning of string", then the empty string to replace, then / to delimit the replacement, then "source_path/" as the thing to replace (/add). This attaches the source path to each element, and doesn't get confused by funny characters in the elements like some versions do.



                            Note that in the above example, "source_path/" has a slash at the end but not the beginning; the "/" right before it is a delimiter. If it started with a slash and contained more slashes, like "/source/path/", it'd still work:



                            cp -a "$files[@]/#//source/path/" "/destanation_path"





                            share|improve this answer













                            As others have pointed out, $files only expands to the first element of the array, and "source_path/$files[@]" only attaches "source_path/" to the first element. But there's a relatively simple way to get all elements, with a path prepended to each:



                            cp -a "$files[@]/#/source_path/" "/destanation_path"


                            This combines the all-elements expansion ([@]) with a substitution. /# means "replace at beginning of string", then the empty string to replace, then / to delimit the replacement, then "source_path/" as the thing to replace (/add). This attaches the source path to each element, and doesn't get confused by funny characters in the elements like some versions do.



                            Note that in the above example, "source_path/" has a slash at the end but not the beginning; the "/" right before it is a delimiter. If it started with a slash and contained more slashes, like "/source/path/", it'd still work:



                            cp -a "$files[@]/#//source/path/" "/destanation_path"






                            share|improve this answer












                            share|improve this answer



                            share|improve this answer










                            answered 7 hours ago









                            Gordon DavissonGordon Davisson

                            2,08512 silver badges10 bronze badges




                            2,08512 silver badges10 bronze badges
























                                -1














                                You can also try the following snippet:



                                IFS=$'n'
                                cp -a $( printf "source_path/%sn" "$files[@]" ) /destination_path/


                                It should also work with filenames with spaces.






                                share|improve this answer

























                                • It works with file names containing spaces, but not with file names containing newlines or wildcards. It's also completely pointless, since cp -a "$files[@]" /destination_path/ works strictly better.

                                  – Gilles
                                  7 hours ago















                                -1














                                You can also try the following snippet:



                                IFS=$'n'
                                cp -a $( printf "source_path/%sn" "$files[@]" ) /destination_path/


                                It should also work with filenames with spaces.






                                share|improve this answer

























                                • It works with file names containing spaces, but not with file names containing newlines or wildcards. It's also completely pointless, since cp -a "$files[@]" /destination_path/ works strictly better.

                                  – Gilles
                                  7 hours ago













                                -1












                                -1








                                -1







                                You can also try the following snippet:



                                IFS=$'n'
                                cp -a $( printf "source_path/%sn" "$files[@]" ) /destination_path/


                                It should also work with filenames with spaces.






                                share|improve this answer













                                You can also try the following snippet:



                                IFS=$'n'
                                cp -a $( printf "source_path/%sn" "$files[@]" ) /destination_path/


                                It should also work with filenames with spaces.







                                share|improve this answer












                                share|improve this answer



                                share|improve this answer










                                answered 10 hours ago









                                tinitatinita

                                1295 bronze badges




                                1295 bronze badges















                                • It works with file names containing spaces, but not with file names containing newlines or wildcards. It's also completely pointless, since cp -a "$files[@]" /destination_path/ works strictly better.

                                  – Gilles
                                  7 hours ago

















                                • It works with file names containing spaces, but not with file names containing newlines or wildcards. It's also completely pointless, since cp -a "$files[@]" /destination_path/ works strictly better.

                                  – Gilles
                                  7 hours ago
















                                It works with file names containing spaces, but not with file names containing newlines or wildcards. It's also completely pointless, since cp -a "$files[@]" /destination_path/ works strictly better.

                                – Gilles
                                7 hours ago





                                It works with file names containing spaces, but not with file names containing newlines or wildcards. It's also completely pointless, since cp -a "$files[@]" /destination_path/ works strictly better.

                                – Gilles
                                7 hours ago

















                                draft saved

                                draft discarded
















































                                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%2f536125%2fjust-one-file-echoed-from-an-array-of-files%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

                                Invision Community Contents History See also References External links Navigation menuProprietaryinvisioncommunity.comIPS Community ForumsIPS Community Forumsthis blog entry"License Changes, IP.Board 3.4, and the Future""Interview -- Matt Mecham of Ibforums""CEO Invision Power Board, Matt Mecham Is a Liar, Thief!"IPB License Explanation 1.3, 1.3.1, 2.0, and 2.1ArchivedSecurity Fixes, Updates And Enhancements For IPB 1.3.1Archived"New Demo Accounts - Invision Power Services"the original"New Default Skin"the original"Invision Power Board 3.0.0 and Applications Released"the original"Archived copy"the original"Perpetual licenses being done away with""Release Notes - Invision Power Services""Introducing: IPS Community Suite 4!"Invision Community Release Notes

                                Canceling a color specificationRandomly assigning color to Graphics3D objects?Default color for Filling in Mathematica 9Coloring specific elements of sets with a prime modified order in an array plotHow to pick a color differing significantly from the colors already in a given color list?Detection of the text colorColor numbers based on their valueCan color schemes for use with ColorData include opacity specification?My dynamic color schemes

                                Ласкавець круглолистий Зміст Опис | Поширення | Галерея | Примітки | Посилання | Навігаційне меню58171138361-22960890446Bupleurum rotundifoliumEuro+Med PlantbasePlants of the World Online — Kew ScienceGermplasm Resources Information Network (GRIN)Ласкавецькн. VI : Літери Ком — Левиправивши або дописавши її