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

                    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

                    Bunad

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