How to rename multiple files in a directory at the same time





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







12















I have directory say /var/tmp/abc which has 4 files:



12345-ram-3e3r5-io9490-89adu9.csv
45434-dam-qwe35-to9490-43adu9.csv
11234-cam-yy3r5-ro9490-85adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv


I want to rename all the CSV files (find all the files & rename them) in shortest possible (probably one-liner) way to this:



XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv









share|improve this question































    12















    I have directory say /var/tmp/abc which has 4 files:



    12345-ram-3e3r5-io9490-89adu9.csv
    45434-dam-qwe35-to9490-43adu9.csv
    11234-cam-yy3r5-ro9490-85adu9.csv
    14423-sam-hh3r5-uo9490-869du9.csv


    I want to rename all the CSV files (find all the files & rename them) in shortest possible (probably one-liner) way to this:



    XXXXX-ram-3e3r5-io9490-89adu9.csv
    XXXXX-dam-qwe35-to9490-43adu9.csv
    XXXXX-cam-yy3r5-ro9490-85adu9.csv
    XXXXX-sam-hh3r5-uo9490-869du9.csv









    share|improve this question



























      12












      12








      12


      3






      I have directory say /var/tmp/abc which has 4 files:



      12345-ram-3e3r5-io9490-89adu9.csv
      45434-dam-qwe35-to9490-43adu9.csv
      11234-cam-yy3r5-ro9490-85adu9.csv
      14423-sam-hh3r5-uo9490-869du9.csv


      I want to rename all the CSV files (find all the files & rename them) in shortest possible (probably one-liner) way to this:



      XXXXX-ram-3e3r5-io9490-89adu9.csv
      XXXXX-dam-qwe35-to9490-43adu9.csv
      XXXXX-cam-yy3r5-ro9490-85adu9.csv
      XXXXX-sam-hh3r5-uo9490-869du9.csv









      share|improve this question
















      I have directory say /var/tmp/abc which has 4 files:



      12345-ram-3e3r5-io9490-89adu9.csv
      45434-dam-qwe35-to9490-43adu9.csv
      11234-cam-yy3r5-ro9490-85adu9.csv
      14423-sam-hh3r5-uo9490-869du9.csv


      I want to rename all the CSV files (find all the files & rename them) in shortest possible (probably one-liner) way to this:



      XXXXX-ram-3e3r5-io9490-89adu9.csv
      XXXXX-dam-qwe35-to9490-43adu9.csv
      XXXXX-cam-yy3r5-ro9490-85adu9.csv
      XXXXX-sam-hh3r5-uo9490-869du9.csv






      shell files rename






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited May 18 at 11:46









      Jeff Schaller

      46.5k1166151




      46.5k1166151










      asked May 14 at 1:47









      Rocky86Rocky86

      136111




      136111






















          4 Answers
          4






          active

          oldest

          votes


















          15














          rename -n 's/(w+)/XXXXX/' *.csv



          remove the -n when happy.






          share|improve this answer



















          • 2





            For a suitable version of rename. I assume this is Larry Wall's rename, from the rename package in Debian and derivative (and IIRC prename on systems of the RedHat persuasion). A very useful tool.

            – xenoid
            May 14 at 7:01






          • 2





            perl-rename in arch linux

            – lesmana
            May 14 at 10:44






          • 1





            @SHawarden, I've tried to execute the command and read the relevant portion of man page to understand the replace pattern, but when adding the verbose flag, it outputs nothing and doesn't perform the file name changes, even though the current path has files with names similar to 12345_foo.csv. Do I have to perform any additional task to get it working (currently on Fedora 30)? It is a cleaner approach than looping. Thanks in advance!

            – danieldeveloper001
            May 14 at 11:23






          • 3





            @danieldeveloper001 Did you use rename or prename? See my comment above. man {the command} lists the authors at the end.

            – xenoid
            May 14 at 11:39








          • 2





            This only works on Debian-derived systems. Fedora-derived systems have a completely different rename command; see unix.stackexchange.com/a/238862/135943

            – Wildcard
            May 15 at 6:02



















          11














          Try:



          for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done


          How it works:





          • for f in *.csv; do



            This starts a loop over all *.csv files.




          • mv -i -- "$f" "XXXXX-${f#*-}"



            This renames the files as you want, asking interactively before overwriting any file.




          • done



            This marks the end of the loop.




          Example:



          $ ls -1
          11234-cam-yy3r5-ro9490-85adu9.csv
          12345-ram-3e3r5-io9490-89adu9.csv
          14423-sam-hh3r5-uo9490-869du9.csv
          45434-dam-qwe35-to9490-43adu9.csv
          $ for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
          $ ls -1
          XXXXX-cam-yy3r5-ro9490-85adu9.csv
          XXXXX-dam-qwe35-to9490-43adu9.csv
          XXXXX-ram-3e3r5-io9490-89adu9.csv
          XXXXX-sam-hh3r5-uo9490-869du9.csv





          share|improve this answer































            4














            I liked the little challenge that you've posted, so here is my solution. I'm assuming that all your files starts with 5 numeric characters, so using the cut command to replace the initial numeric files by "XXXXX".



            Below, the files before the command.



            -rw-rw-r--. 1 daniel daniel 0 May 13 23:18 11111_bar_file.csv
            -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 12345_baz_file.csv
            -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml


            Below, the one liner command.



            for src in *.csv; do dst=XXXXX$(echo $src| cut -c6-); mv $src $dst; done;


            Below, the files after the command.



            -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
            -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 XXXXX_bar_file.csv
            -rw-rw-r--. 1 daniel daniel 0 May 13 23:18 XXXXX_baz_file.csv


            Is that what you're looking for? :)



            References:



            Looping through command output in bash



            Substrings in bash






            share|improve this answer





















            • 2





              Bash can do this sort of string manipulation, no need to fork a new process for each, please the other answer on how.

              – chx
              May 14 at 23:45






            • 1





              @chx, already saw the other answers and acquired a little bit of knowledge from it, but thanks for pointing them out. Would you please elaborate on no need to fork a new process for each?

              – danieldeveloper001
              May 15 at 0:19








            • 3





              cut is a separate binary (/usr/bin/cut) and running it consumes more resources than using shell built ins.

              – chx
              May 15 at 0:42






            • 2





              I see, it actually matters if the intent is renaming a lot of files. Thank you for the clarification!

              – danieldeveloper001
              May 15 at 0:55



















            1














            no forks:



            ls | perl -lne '$suf=substr($_,6); rename $_, "XXXXX-$suf"'


            When you use a shell loop, the mv forks once per file. Perl's rename command does not.



            (Perl's rename command has some restrictions, but in this specific case those restrictions don't apply.)



            As for the rename command shown earlier, yes that works, but then you have all that confusion between two different kinds of rename and so on. If you have the right one, great, but if not, this works too.



            If you don't have the perl-rename command and can't install it, you can just do this:



            ls | perl -lne '$old=$_; s/(w+)/XXXXX/; rename $old, $_'


            As you can see, this uses the same substitution shown in the top answer. Of course the perl-rename has other bells and whistles (the top answer mentioned, -n already, then there's -0, -f, and so on), and the more of them you need, the more you should install that instead of rolling your own in this manner.






            share|improve this answer


























            • The usual implementations of a pipe will have forks.

              – muru
              May 17 at 5:24











            • I meant, "won't fork once per file to be renamed", unlike even shell, where the "mv" forks /usr/bin/mv or whatever. This is because the "rename" command is a perl internal command that directly calls rename() in libc. Of course it has some restrictions, but in this specific example those restrictions don't apply.

              – sitaram
              May 17 at 5:31








            • 1





              That's also true of the rename command (top answer, also uses Perl), so maybe you should add a little more explanation than simply "no forks" to the answer.

              – muru
              May 17 at 5:33














            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%2f518800%2fhow-to-rename-multiple-files-in-a-directory-at-the-same-time%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









            15














            rename -n 's/(w+)/XXXXX/' *.csv



            remove the -n when happy.






            share|improve this answer



















            • 2





              For a suitable version of rename. I assume this is Larry Wall's rename, from the rename package in Debian and derivative (and IIRC prename on systems of the RedHat persuasion). A very useful tool.

              – xenoid
              May 14 at 7:01






            • 2





              perl-rename in arch linux

              – lesmana
              May 14 at 10:44






            • 1





              @SHawarden, I've tried to execute the command and read the relevant portion of man page to understand the replace pattern, but when adding the verbose flag, it outputs nothing and doesn't perform the file name changes, even though the current path has files with names similar to 12345_foo.csv. Do I have to perform any additional task to get it working (currently on Fedora 30)? It is a cleaner approach than looping. Thanks in advance!

              – danieldeveloper001
              May 14 at 11:23






            • 3





              @danieldeveloper001 Did you use rename or prename? See my comment above. man {the command} lists the authors at the end.

              – xenoid
              May 14 at 11:39








            • 2





              This only works on Debian-derived systems. Fedora-derived systems have a completely different rename command; see unix.stackexchange.com/a/238862/135943

              – Wildcard
              May 15 at 6:02
















            15














            rename -n 's/(w+)/XXXXX/' *.csv



            remove the -n when happy.






            share|improve this answer



















            • 2





              For a suitable version of rename. I assume this is Larry Wall's rename, from the rename package in Debian and derivative (and IIRC prename on systems of the RedHat persuasion). A very useful tool.

              – xenoid
              May 14 at 7:01






            • 2





              perl-rename in arch linux

              – lesmana
              May 14 at 10:44






            • 1





              @SHawarden, I've tried to execute the command and read the relevant portion of man page to understand the replace pattern, but when adding the verbose flag, it outputs nothing and doesn't perform the file name changes, even though the current path has files with names similar to 12345_foo.csv. Do I have to perform any additional task to get it working (currently on Fedora 30)? It is a cleaner approach than looping. Thanks in advance!

              – danieldeveloper001
              May 14 at 11:23






            • 3





              @danieldeveloper001 Did you use rename or prename? See my comment above. man {the command} lists the authors at the end.

              – xenoid
              May 14 at 11:39








            • 2





              This only works on Debian-derived systems. Fedora-derived systems have a completely different rename command; see unix.stackexchange.com/a/238862/135943

              – Wildcard
              May 15 at 6:02














            15












            15








            15







            rename -n 's/(w+)/XXXXX/' *.csv



            remove the -n when happy.






            share|improve this answer













            rename -n 's/(w+)/XXXXX/' *.csv



            remove the -n when happy.







            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered May 14 at 2:26









            SHawardenSHawarden

            36415




            36415








            • 2





              For a suitable version of rename. I assume this is Larry Wall's rename, from the rename package in Debian and derivative (and IIRC prename on systems of the RedHat persuasion). A very useful tool.

              – xenoid
              May 14 at 7:01






            • 2





              perl-rename in arch linux

              – lesmana
              May 14 at 10:44






            • 1





              @SHawarden, I've tried to execute the command and read the relevant portion of man page to understand the replace pattern, but when adding the verbose flag, it outputs nothing and doesn't perform the file name changes, even though the current path has files with names similar to 12345_foo.csv. Do I have to perform any additional task to get it working (currently on Fedora 30)? It is a cleaner approach than looping. Thanks in advance!

              – danieldeveloper001
              May 14 at 11:23






            • 3





              @danieldeveloper001 Did you use rename or prename? See my comment above. man {the command} lists the authors at the end.

              – xenoid
              May 14 at 11:39








            • 2





              This only works on Debian-derived systems. Fedora-derived systems have a completely different rename command; see unix.stackexchange.com/a/238862/135943

              – Wildcard
              May 15 at 6:02














            • 2





              For a suitable version of rename. I assume this is Larry Wall's rename, from the rename package in Debian and derivative (and IIRC prename on systems of the RedHat persuasion). A very useful tool.

              – xenoid
              May 14 at 7:01






            • 2





              perl-rename in arch linux

              – lesmana
              May 14 at 10:44






            • 1





              @SHawarden, I've tried to execute the command and read the relevant portion of man page to understand the replace pattern, but when adding the verbose flag, it outputs nothing and doesn't perform the file name changes, even though the current path has files with names similar to 12345_foo.csv. Do I have to perform any additional task to get it working (currently on Fedora 30)? It is a cleaner approach than looping. Thanks in advance!

              – danieldeveloper001
              May 14 at 11:23






            • 3





              @danieldeveloper001 Did you use rename or prename? See my comment above. man {the command} lists the authors at the end.

              – xenoid
              May 14 at 11:39








            • 2





              This only works on Debian-derived systems. Fedora-derived systems have a completely different rename command; see unix.stackexchange.com/a/238862/135943

              – Wildcard
              May 15 at 6:02








            2




            2





            For a suitable version of rename. I assume this is Larry Wall's rename, from the rename package in Debian and derivative (and IIRC prename on systems of the RedHat persuasion). A very useful tool.

            – xenoid
            May 14 at 7:01





            For a suitable version of rename. I assume this is Larry Wall's rename, from the rename package in Debian and derivative (and IIRC prename on systems of the RedHat persuasion). A very useful tool.

            – xenoid
            May 14 at 7:01




            2




            2





            perl-rename in arch linux

            – lesmana
            May 14 at 10:44





            perl-rename in arch linux

            – lesmana
            May 14 at 10:44




            1




            1





            @SHawarden, I've tried to execute the command and read the relevant portion of man page to understand the replace pattern, but when adding the verbose flag, it outputs nothing and doesn't perform the file name changes, even though the current path has files with names similar to 12345_foo.csv. Do I have to perform any additional task to get it working (currently on Fedora 30)? It is a cleaner approach than looping. Thanks in advance!

            – danieldeveloper001
            May 14 at 11:23





            @SHawarden, I've tried to execute the command and read the relevant portion of man page to understand the replace pattern, but when adding the verbose flag, it outputs nothing and doesn't perform the file name changes, even though the current path has files with names similar to 12345_foo.csv. Do I have to perform any additional task to get it working (currently on Fedora 30)? It is a cleaner approach than looping. Thanks in advance!

            – danieldeveloper001
            May 14 at 11:23




            3




            3





            @danieldeveloper001 Did you use rename or prename? See my comment above. man {the command} lists the authors at the end.

            – xenoid
            May 14 at 11:39







            @danieldeveloper001 Did you use rename or prename? See my comment above. man {the command} lists the authors at the end.

            – xenoid
            May 14 at 11:39






            2




            2





            This only works on Debian-derived systems. Fedora-derived systems have a completely different rename command; see unix.stackexchange.com/a/238862/135943

            – Wildcard
            May 15 at 6:02





            This only works on Debian-derived systems. Fedora-derived systems have a completely different rename command; see unix.stackexchange.com/a/238862/135943

            – Wildcard
            May 15 at 6:02













            11














            Try:



            for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done


            How it works:





            • for f in *.csv; do



              This starts a loop over all *.csv files.




            • mv -i -- "$f" "XXXXX-${f#*-}"



              This renames the files as you want, asking interactively before overwriting any file.




            • done



              This marks the end of the loop.




            Example:



            $ ls -1
            11234-cam-yy3r5-ro9490-85adu9.csv
            12345-ram-3e3r5-io9490-89adu9.csv
            14423-sam-hh3r5-uo9490-869du9.csv
            45434-dam-qwe35-to9490-43adu9.csv
            $ for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
            $ ls -1
            XXXXX-cam-yy3r5-ro9490-85adu9.csv
            XXXXX-dam-qwe35-to9490-43adu9.csv
            XXXXX-ram-3e3r5-io9490-89adu9.csv
            XXXXX-sam-hh3r5-uo9490-869du9.csv





            share|improve this answer




























              11














              Try:



              for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done


              How it works:





              • for f in *.csv; do



                This starts a loop over all *.csv files.




              • mv -i -- "$f" "XXXXX-${f#*-}"



                This renames the files as you want, asking interactively before overwriting any file.




              • done



                This marks the end of the loop.




              Example:



              $ ls -1
              11234-cam-yy3r5-ro9490-85adu9.csv
              12345-ram-3e3r5-io9490-89adu9.csv
              14423-sam-hh3r5-uo9490-869du9.csv
              45434-dam-qwe35-to9490-43adu9.csv
              $ for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
              $ ls -1
              XXXXX-cam-yy3r5-ro9490-85adu9.csv
              XXXXX-dam-qwe35-to9490-43adu9.csv
              XXXXX-ram-3e3r5-io9490-89adu9.csv
              XXXXX-sam-hh3r5-uo9490-869du9.csv





              share|improve this answer


























                11












                11








                11







                Try:



                for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done


                How it works:





                • for f in *.csv; do



                  This starts a loop over all *.csv files.




                • mv -i -- "$f" "XXXXX-${f#*-}"



                  This renames the files as you want, asking interactively before overwriting any file.




                • done



                  This marks the end of the loop.




                Example:



                $ ls -1
                11234-cam-yy3r5-ro9490-85adu9.csv
                12345-ram-3e3r5-io9490-89adu9.csv
                14423-sam-hh3r5-uo9490-869du9.csv
                45434-dam-qwe35-to9490-43adu9.csv
                $ for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
                $ ls -1
                XXXXX-cam-yy3r5-ro9490-85adu9.csv
                XXXXX-dam-qwe35-to9490-43adu9.csv
                XXXXX-ram-3e3r5-io9490-89adu9.csv
                XXXXX-sam-hh3r5-uo9490-869du9.csv





                share|improve this answer













                Try:



                for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done


                How it works:





                • for f in *.csv; do



                  This starts a loop over all *.csv files.




                • mv -i -- "$f" "XXXXX-${f#*-}"



                  This renames the files as you want, asking interactively before overwriting any file.




                • done



                  This marks the end of the loop.




                Example:



                $ ls -1
                11234-cam-yy3r5-ro9490-85adu9.csv
                12345-ram-3e3r5-io9490-89adu9.csv
                14423-sam-hh3r5-uo9490-869du9.csv
                45434-dam-qwe35-to9490-43adu9.csv
                $ for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
                $ ls -1
                XXXXX-cam-yy3r5-ro9490-85adu9.csv
                XXXXX-dam-qwe35-to9490-43adu9.csv
                XXXXX-ram-3e3r5-io9490-89adu9.csv
                XXXXX-sam-hh3r5-uo9490-869du9.csv






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered May 14 at 2:20









                John1024John1024

                50.2k5117131




                50.2k5117131























                    4














                    I liked the little challenge that you've posted, so here is my solution. I'm assuming that all your files starts with 5 numeric characters, so using the cut command to replace the initial numeric files by "XXXXX".



                    Below, the files before the command.



                    -rw-rw-r--. 1 daniel daniel 0 May 13 23:18 11111_bar_file.csv
                    -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 12345_baz_file.csv
                    -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml


                    Below, the one liner command.



                    for src in *.csv; do dst=XXXXX$(echo $src| cut -c6-); mv $src $dst; done;


                    Below, the files after the command.



                    -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
                    -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 XXXXX_bar_file.csv
                    -rw-rw-r--. 1 daniel daniel 0 May 13 23:18 XXXXX_baz_file.csv


                    Is that what you're looking for? :)



                    References:



                    Looping through command output in bash



                    Substrings in bash






                    share|improve this answer





















                    • 2





                      Bash can do this sort of string manipulation, no need to fork a new process for each, please the other answer on how.

                      – chx
                      May 14 at 23:45






                    • 1





                      @chx, already saw the other answers and acquired a little bit of knowledge from it, but thanks for pointing them out. Would you please elaborate on no need to fork a new process for each?

                      – danieldeveloper001
                      May 15 at 0:19








                    • 3





                      cut is a separate binary (/usr/bin/cut) and running it consumes more resources than using shell built ins.

                      – chx
                      May 15 at 0:42






                    • 2





                      I see, it actually matters if the intent is renaming a lot of files. Thank you for the clarification!

                      – danieldeveloper001
                      May 15 at 0:55
















                    4














                    I liked the little challenge that you've posted, so here is my solution. I'm assuming that all your files starts with 5 numeric characters, so using the cut command to replace the initial numeric files by "XXXXX".



                    Below, the files before the command.



                    -rw-rw-r--. 1 daniel daniel 0 May 13 23:18 11111_bar_file.csv
                    -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 12345_baz_file.csv
                    -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml


                    Below, the one liner command.



                    for src in *.csv; do dst=XXXXX$(echo $src| cut -c6-); mv $src $dst; done;


                    Below, the files after the command.



                    -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
                    -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 XXXXX_bar_file.csv
                    -rw-rw-r--. 1 daniel daniel 0 May 13 23:18 XXXXX_baz_file.csv


                    Is that what you're looking for? :)



                    References:



                    Looping through command output in bash



                    Substrings in bash






                    share|improve this answer





















                    • 2





                      Bash can do this sort of string manipulation, no need to fork a new process for each, please the other answer on how.

                      – chx
                      May 14 at 23:45






                    • 1





                      @chx, already saw the other answers and acquired a little bit of knowledge from it, but thanks for pointing them out. Would you please elaborate on no need to fork a new process for each?

                      – danieldeveloper001
                      May 15 at 0:19








                    • 3





                      cut is a separate binary (/usr/bin/cut) and running it consumes more resources than using shell built ins.

                      – chx
                      May 15 at 0:42






                    • 2





                      I see, it actually matters if the intent is renaming a lot of files. Thank you for the clarification!

                      – danieldeveloper001
                      May 15 at 0:55














                    4












                    4








                    4







                    I liked the little challenge that you've posted, so here is my solution. I'm assuming that all your files starts with 5 numeric characters, so using the cut command to replace the initial numeric files by "XXXXX".



                    Below, the files before the command.



                    -rw-rw-r--. 1 daniel daniel 0 May 13 23:18 11111_bar_file.csv
                    -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 12345_baz_file.csv
                    -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml


                    Below, the one liner command.



                    for src in *.csv; do dst=XXXXX$(echo $src| cut -c6-); mv $src $dst; done;


                    Below, the files after the command.



                    -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
                    -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 XXXXX_bar_file.csv
                    -rw-rw-r--. 1 daniel daniel 0 May 13 23:18 XXXXX_baz_file.csv


                    Is that what you're looking for? :)



                    References:



                    Looping through command output in bash



                    Substrings in bash






                    share|improve this answer















                    I liked the little challenge that you've posted, so here is my solution. I'm assuming that all your files starts with 5 numeric characters, so using the cut command to replace the initial numeric files by "XXXXX".



                    Below, the files before the command.



                    -rw-rw-r--. 1 daniel daniel 0 May 13 23:18 11111_bar_file.csv
                    -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 12345_baz_file.csv
                    -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml


                    Below, the one liner command.



                    for src in *.csv; do dst=XXXXX$(echo $src| cut -c6-); mv $src $dst; done;


                    Below, the files after the command.



                    -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
                    -rw-rw-r--. 1 daniel daniel 0 May 13 22:54 XXXXX_bar_file.csv
                    -rw-rw-r--. 1 daniel daniel 0 May 13 23:18 XXXXX_baz_file.csv


                    Is that what you're looking for? :)



                    References:



                    Looping through command output in bash



                    Substrings in bash







                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited May 14 at 2:26

























                    answered May 14 at 2:21









                    danieldeveloper001danieldeveloper001

                    1796




                    1796








                    • 2





                      Bash can do this sort of string manipulation, no need to fork a new process for each, please the other answer on how.

                      – chx
                      May 14 at 23:45






                    • 1





                      @chx, already saw the other answers and acquired a little bit of knowledge from it, but thanks for pointing them out. Would you please elaborate on no need to fork a new process for each?

                      – danieldeveloper001
                      May 15 at 0:19








                    • 3





                      cut is a separate binary (/usr/bin/cut) and running it consumes more resources than using shell built ins.

                      – chx
                      May 15 at 0:42






                    • 2





                      I see, it actually matters if the intent is renaming a lot of files. Thank you for the clarification!

                      – danieldeveloper001
                      May 15 at 0:55














                    • 2





                      Bash can do this sort of string manipulation, no need to fork a new process for each, please the other answer on how.

                      – chx
                      May 14 at 23:45






                    • 1





                      @chx, already saw the other answers and acquired a little bit of knowledge from it, but thanks for pointing them out. Would you please elaborate on no need to fork a new process for each?

                      – danieldeveloper001
                      May 15 at 0:19








                    • 3





                      cut is a separate binary (/usr/bin/cut) and running it consumes more resources than using shell built ins.

                      – chx
                      May 15 at 0:42






                    • 2





                      I see, it actually matters if the intent is renaming a lot of files. Thank you for the clarification!

                      – danieldeveloper001
                      May 15 at 0:55








                    2




                    2





                    Bash can do this sort of string manipulation, no need to fork a new process for each, please the other answer on how.

                    – chx
                    May 14 at 23:45





                    Bash can do this sort of string manipulation, no need to fork a new process for each, please the other answer on how.

                    – chx
                    May 14 at 23:45




                    1




                    1





                    @chx, already saw the other answers and acquired a little bit of knowledge from it, but thanks for pointing them out. Would you please elaborate on no need to fork a new process for each?

                    – danieldeveloper001
                    May 15 at 0:19







                    @chx, already saw the other answers and acquired a little bit of knowledge from it, but thanks for pointing them out. Would you please elaborate on no need to fork a new process for each?

                    – danieldeveloper001
                    May 15 at 0:19






                    3




                    3





                    cut is a separate binary (/usr/bin/cut) and running it consumes more resources than using shell built ins.

                    – chx
                    May 15 at 0:42





                    cut is a separate binary (/usr/bin/cut) and running it consumes more resources than using shell built ins.

                    – chx
                    May 15 at 0:42




                    2




                    2





                    I see, it actually matters if the intent is renaming a lot of files. Thank you for the clarification!

                    – danieldeveloper001
                    May 15 at 0:55





                    I see, it actually matters if the intent is renaming a lot of files. Thank you for the clarification!

                    – danieldeveloper001
                    May 15 at 0:55











                    1














                    no forks:



                    ls | perl -lne '$suf=substr($_,6); rename $_, "XXXXX-$suf"'


                    When you use a shell loop, the mv forks once per file. Perl's rename command does not.



                    (Perl's rename command has some restrictions, but in this specific case those restrictions don't apply.)



                    As for the rename command shown earlier, yes that works, but then you have all that confusion between two different kinds of rename and so on. If you have the right one, great, but if not, this works too.



                    If you don't have the perl-rename command and can't install it, you can just do this:



                    ls | perl -lne '$old=$_; s/(w+)/XXXXX/; rename $old, $_'


                    As you can see, this uses the same substitution shown in the top answer. Of course the perl-rename has other bells and whistles (the top answer mentioned, -n already, then there's -0, -f, and so on), and the more of them you need, the more you should install that instead of rolling your own in this manner.






                    share|improve this answer


























                    • The usual implementations of a pipe will have forks.

                      – muru
                      May 17 at 5:24











                    • I meant, "won't fork once per file to be renamed", unlike even shell, where the "mv" forks /usr/bin/mv or whatever. This is because the "rename" command is a perl internal command that directly calls rename() in libc. Of course it has some restrictions, but in this specific example those restrictions don't apply.

                      – sitaram
                      May 17 at 5:31








                    • 1





                      That's also true of the rename command (top answer, also uses Perl), so maybe you should add a little more explanation than simply "no forks" to the answer.

                      – muru
                      May 17 at 5:33


















                    1














                    no forks:



                    ls | perl -lne '$suf=substr($_,6); rename $_, "XXXXX-$suf"'


                    When you use a shell loop, the mv forks once per file. Perl's rename command does not.



                    (Perl's rename command has some restrictions, but in this specific case those restrictions don't apply.)



                    As for the rename command shown earlier, yes that works, but then you have all that confusion between two different kinds of rename and so on. If you have the right one, great, but if not, this works too.



                    If you don't have the perl-rename command and can't install it, you can just do this:



                    ls | perl -lne '$old=$_; s/(w+)/XXXXX/; rename $old, $_'


                    As you can see, this uses the same substitution shown in the top answer. Of course the perl-rename has other bells and whistles (the top answer mentioned, -n already, then there's -0, -f, and so on), and the more of them you need, the more you should install that instead of rolling your own in this manner.






                    share|improve this answer


























                    • The usual implementations of a pipe will have forks.

                      – muru
                      May 17 at 5:24











                    • I meant, "won't fork once per file to be renamed", unlike even shell, where the "mv" forks /usr/bin/mv or whatever. This is because the "rename" command is a perl internal command that directly calls rename() in libc. Of course it has some restrictions, but in this specific example those restrictions don't apply.

                      – sitaram
                      May 17 at 5:31








                    • 1





                      That's also true of the rename command (top answer, also uses Perl), so maybe you should add a little more explanation than simply "no forks" to the answer.

                      – muru
                      May 17 at 5:33
















                    1












                    1








                    1







                    no forks:



                    ls | perl -lne '$suf=substr($_,6); rename $_, "XXXXX-$suf"'


                    When you use a shell loop, the mv forks once per file. Perl's rename command does not.



                    (Perl's rename command has some restrictions, but in this specific case those restrictions don't apply.)



                    As for the rename command shown earlier, yes that works, but then you have all that confusion between two different kinds of rename and so on. If you have the right one, great, but if not, this works too.



                    If you don't have the perl-rename command and can't install it, you can just do this:



                    ls | perl -lne '$old=$_; s/(w+)/XXXXX/; rename $old, $_'


                    As you can see, this uses the same substitution shown in the top answer. Of course the perl-rename has other bells and whistles (the top answer mentioned, -n already, then there's -0, -f, and so on), and the more of them you need, the more you should install that instead of rolling your own in this manner.






                    share|improve this answer















                    no forks:



                    ls | perl -lne '$suf=substr($_,6); rename $_, "XXXXX-$suf"'


                    When you use a shell loop, the mv forks once per file. Perl's rename command does not.



                    (Perl's rename command has some restrictions, but in this specific case those restrictions don't apply.)



                    As for the rename command shown earlier, yes that works, but then you have all that confusion between two different kinds of rename and so on. If you have the right one, great, but if not, this works too.



                    If you don't have the perl-rename command and can't install it, you can just do this:



                    ls | perl -lne '$old=$_; s/(w+)/XXXXX/; rename $old, $_'


                    As you can see, this uses the same substitution shown in the top answer. Of course the perl-rename has other bells and whistles (the top answer mentioned, -n already, then there's -0, -f, and so on), and the more of them you need, the more you should install that instead of rolling your own in this manner.







                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited May 17 at 6:15









                    muru

                    39.2k595170




                    39.2k595170










                    answered May 17 at 5:15









                    sitaramsitaram

                    713




                    713













                    • The usual implementations of a pipe will have forks.

                      – muru
                      May 17 at 5:24











                    • I meant, "won't fork once per file to be renamed", unlike even shell, where the "mv" forks /usr/bin/mv or whatever. This is because the "rename" command is a perl internal command that directly calls rename() in libc. Of course it has some restrictions, but in this specific example those restrictions don't apply.

                      – sitaram
                      May 17 at 5:31








                    • 1





                      That's also true of the rename command (top answer, also uses Perl), so maybe you should add a little more explanation than simply "no forks" to the answer.

                      – muru
                      May 17 at 5:33





















                    • The usual implementations of a pipe will have forks.

                      – muru
                      May 17 at 5:24











                    • I meant, "won't fork once per file to be renamed", unlike even shell, where the "mv" forks /usr/bin/mv or whatever. This is because the "rename" command is a perl internal command that directly calls rename() in libc. Of course it has some restrictions, but in this specific example those restrictions don't apply.

                      – sitaram
                      May 17 at 5:31








                    • 1





                      That's also true of the rename command (top answer, also uses Perl), so maybe you should add a little more explanation than simply "no forks" to the answer.

                      – muru
                      May 17 at 5:33



















                    The usual implementations of a pipe will have forks.

                    – muru
                    May 17 at 5:24





                    The usual implementations of a pipe will have forks.

                    – muru
                    May 17 at 5:24













                    I meant, "won't fork once per file to be renamed", unlike even shell, where the "mv" forks /usr/bin/mv or whatever. This is because the "rename" command is a perl internal command that directly calls rename() in libc. Of course it has some restrictions, but in this specific example those restrictions don't apply.

                    – sitaram
                    May 17 at 5:31







                    I meant, "won't fork once per file to be renamed", unlike even shell, where the "mv" forks /usr/bin/mv or whatever. This is because the "rename" command is a perl internal command that directly calls rename() in libc. Of course it has some restrictions, but in this specific example those restrictions don't apply.

                    – sitaram
                    May 17 at 5:31






                    1




                    1





                    That's also true of the rename command (top answer, also uses Perl), so maybe you should add a little more explanation than simply "no forks" to the answer.

                    – muru
                    May 17 at 5:33







                    That's also true of the rename command (top answer, also uses Perl), so maybe you should add a little more explanation than simply "no forks" to the answer.

                    – muru
                    May 17 at 5:33




















                    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%2f518800%2fhow-to-rename-multiple-files-in-a-directory-at-the-same-time%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

                    Færeyskur hestur Heimild | Tengill | Tilvísanir | LeiðsagnarvalRossið - síða um færeyska hrossið á færeyskuGott ár hjá færeyska hestinum

                    He _____ here since 1970 . Answer needed [closed]What does “since he was so high” mean?Meaning of “catch birds for”?How do I ensure “since” takes the meaning I want?“Who cares here” meaningWhat does “right round toward” mean?the time tense (had now been detected)What does the phrase “ring around the roses” mean here?Correct usage of “visited upon”Meaning of “foiled rail sabotage bid”It was the third time I had gone to Rome or It is the third time I had been to Rome

                    Slayer Innehåll Historia | Stil, komposition och lyrik | Bandets betydelse och framgångar | Sidoprojekt och samarbeten | Kontroverser | Medlemmar | Utmärkelser och nomineringar | Turnéer och festivaler | Diskografi | Referenser | Externa länkar | Navigeringsmenywww.slayer.net”Metal Massacre vol. 1””Metal Massacre vol. 3””Metal Massacre Volume III””Show No Mercy””Haunting the Chapel””Live Undead””Hell Awaits””Reign in Blood””Reign in Blood””Gold & Platinum – Reign in Blood””Golden Gods Awards Winners”originalet”Kerrang! Hall Of Fame””Slayer Looks Back On 37-Year Career In New Video Series: Part Two””South of Heaven””Gold & Platinum – South of Heaven””Seasons in the Abyss””Gold & Platinum - Seasons in the Abyss””Divine Intervention””Divine Intervention - Release group by Slayer””Gold & Platinum - Divine Intervention””Live Intrusion””Undisputed Attitude””Abolish Government/Superficial Love””Release “Slatanic Slaughter: A Tribute to Slayer” by Various Artists””Diabolus in Musica””Soundtrack to the Apocalypse””God Hates Us All””Systematic - Relationships””War at the Warfield””Gold & Platinum - War at the Warfield””Soundtrack to the Apocalypse””Gold & Platinum - Still Reigning””Metallica, Slayer, Iron Mauden Among Winners At Metal Hammer Awards””Eternal Pyre””Eternal Pyre - Slayer release group””Eternal Pyre””Metal Storm Awards 2006””Kerrang! Hall Of Fame””Slayer Wins 'Best Metal' Grammy Award””Slayer Guitarist Jeff Hanneman Dies””Bullet-For My Valentine booed at Metal Hammer Golden Gods Awards””Unholy Aliance””The End Of Slayer?””Slayer: We Could Thrash Out Two More Albums If We're Fast Enough...””'The Unholy Alliance: Chapter III' UK Dates Added”originalet”Megadeth And Slayer To Co-Headline 'Canadian Carnage' Trek”originalet”World Painted Blood””Release “World Painted Blood” by Slayer””Metallica Heading To Cinemas””Slayer, Megadeth To Join Forces For 'European Carnage' Tour - Dec. 18, 2010”originalet”Slayer's Hanneman Contracts Acute Infection; Band To Bring In Guest Guitarist””Cannibal Corpse's Pat O'Brien Will Step In As Slayer's Guest Guitarist”originalet”Slayer’s Jeff Hanneman Dead at 49””Dave Lombardo Says He Made Only $67,000 In 2011 While Touring With Slayer””Slayer: We Do Not Agree With Dave Lombardo's Substance Or Timeline Of Events””Slayer Welcomes Drummer Paul Bostaph Back To The Fold””Slayer Hope to Unveil Never-Before-Heard Jeff Hanneman Material on Next Album””Slayer Debut New Song 'Implode' During Surprise Golden Gods Appearance””Release group Repentless by Slayer””Repentless - Slayer - Credits””Slayer””Metal Storm Awards 2015””Slayer - to release comic book "Repentless #1"””Slayer To Release 'Repentless' 6.66" Vinyl Box Set””BREAKING NEWS: Slayer Announce Farewell Tour””Slayer Recruit Lamb of God, Anthrax, Behemoth + Testament for Final Tour””Slayer lägger ner efter 37 år””Slayer Announces Second North American Leg Of 'Final' Tour””Final World Tour””Slayer Announces Final European Tour With Lamb of God, Anthrax And Obituary””Slayer To Tour Europe With Lamb of God, Anthrax And Obituary””Slayer To Play 'Last French Show Ever' At Next Year's Hellfst””Slayer's Final World Tour Will Extend Into 2019””Death Angel's Rob Cavestany On Slayer's 'Farewell' Tour: 'Some Of Us Could See This Coming'””Testament Has No Plans To Retire Anytime Soon, Says Chuck Billy””Anthrax's Scott Ian On Slayer's 'Farewell' Tour Plans: 'I Was Surprised And I Wasn't Surprised'””Slayer””Slayer's Morbid Schlock””Review/Rock; For Slayer, the Mania Is the Message””Slayer - Biography””Slayer - Reign In Blood”originalet”Dave Lombardo””An exclusive oral history of Slayer”originalet”Exclusive! Interview With Slayer Guitarist Jeff Hanneman”originalet”Thinking Out Loud: Slayer's Kerry King on hair metal, Satan and being polite””Slayer Lyrics””Slayer - Biography””Most influential artists for extreme metal music””Slayer - Reign in Blood””Slayer guitarist Jeff Hanneman dies aged 49””Slatanic Slaughter: A Tribute to Slayer””Gateway to Hell: A Tribute to Slayer””Covered In Blood””Slayer: The Origins of Thrash in San Francisco, CA.””Why They Rule - #6 Slayer”originalet”Guitar World's 100 Greatest Heavy Metal Guitarists Of All Time”originalet”The fans have spoken: Slayer comes out on top in readers' polls”originalet”Tribute to Jeff Hanneman (1964-2013)””Lamb Of God Frontman: We Sound Like A Slayer Rip-Off””BEHEMOTH Frontman Pays Tribute To SLAYER's JEFF HANNEMAN””Slayer, Hatebreed Doing Double Duty On This Year's Ozzfest””System of a Down””Lacuna Coil’s Andrea Ferro Talks Influences, Skateboarding, Band Origins + More””Slayer - Reign in Blood””Into The Lungs of Hell””Slayer rules - en utställning om fans””Slayer and Their Fans Slashed Through a No-Holds-Barred Night at Gas Monkey””Home””Slayer””Gold & Platinum - The Big 4 Live from Sofia, Bulgaria””Exclusive! Interview With Slayer Guitarist Kerry King””2008-02-23: Wiltern, Los Angeles, CA, USA””Slayer's Kerry King To Perform With Megadeth Tonight! - Oct. 21, 2010”originalet”Dave Lombardo - Biography”Slayer Case DismissedArkiveradUltimate Classic Rock: Slayer guitarist Jeff Hanneman dead at 49.”Slayer: "We could never do any thing like Some Kind Of Monster..."””Cannibal Corpse'S Pat O'Brien Will Step In As Slayer'S Guest Guitarist | The Official Slayer Site”originalet”Slayer Wins 'Best Metal' Grammy Award””Slayer Guitarist Jeff Hanneman Dies””Kerrang! Awards 2006 Blog: Kerrang! Hall Of Fame””Kerrang! Awards 2013: Kerrang! Legend”originalet”Metallica, Slayer, Iron Maien Among Winners At Metal Hammer Awards””Metal Hammer Golden Gods Awards””Bullet For My Valentine Booed At Metal Hammer Golden Gods Awards””Metal Storm Awards 2006””Metal Storm Awards 2015””Slayer's Concert History””Slayer - Relationships””Slayer - Releases”Slayers officiella webbplatsSlayer på MusicBrainzOfficiell webbplatsSlayerSlayerr1373445760000 0001 1540 47353068615-5086262726cb13906545x(data)6033143kn20030215029