Break down a large folder into multiple subfolders by sequential names












0














I have a folder with 20000 files in it. I need to split it into subfolders with increasing directory name (dir_1, dir_2....) with each folder having 500 files each in such a way that for example if files are from file_1.png to file_20000, the first folder should contain first 500 files i.e., file_1 to file 500 and immediate folder should contain files in a continued manner i.e, file_501 to file_1000 and so on. I have tried many scripts on internet but none helped me. Can anyone please help me in making this possible..
enter image description here










share|improve this question









New contributor




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
















  • 1




    I'd love to see a more informative title to this question!
    – Jeff Schaller
    29 mins ago






  • 2




    please please do not post images of text. Or, if you must, at least don't post such sparse images, and make them more helpful in the context of the question.
    – DopeGhoti
    14 mins ago
















0














I have a folder with 20000 files in it. I need to split it into subfolders with increasing directory name (dir_1, dir_2....) with each folder having 500 files each in such a way that for example if files are from file_1.png to file_20000, the first folder should contain first 500 files i.e., file_1 to file 500 and immediate folder should contain files in a continued manner i.e, file_501 to file_1000 and so on. I have tried many scripts on internet but none helped me. Can anyone please help me in making this possible..
enter image description here










share|improve this question









New contributor




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
















  • 1




    I'd love to see a more informative title to this question!
    – Jeff Schaller
    29 mins ago






  • 2




    please please do not post images of text. Or, if you must, at least don't post such sparse images, and make them more helpful in the context of the question.
    – DopeGhoti
    14 mins ago














0












0








0


1





I have a folder with 20000 files in it. I need to split it into subfolders with increasing directory name (dir_1, dir_2....) with each folder having 500 files each in such a way that for example if files are from file_1.png to file_20000, the first folder should contain first 500 files i.e., file_1 to file 500 and immediate folder should contain files in a continued manner i.e, file_501 to file_1000 and so on. I have tried many scripts on internet but none helped me. Can anyone please help me in making this possible..
enter image description here










share|improve this question









New contributor




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











I have a folder with 20000 files in it. I need to split it into subfolders with increasing directory name (dir_1, dir_2....) with each folder having 500 files each in such a way that for example if files are from file_1.png to file_20000, the first folder should contain first 500 files i.e., file_1 to file 500 and immediate folder should contain files in a continued manner i.e, file_501 to file_1000 and so on. I have tried many scripts on internet but none helped me. Can anyone please help me in making this possible..
enter image description here







shell-script






share|improve this question









New contributor




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











share|improve this question









New contributor




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









share|improve this question




share|improve this question








edited 23 mins ago







Praveen Kumar













New contributor




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









asked 31 mins ago









Praveen KumarPraveen Kumar

12




12




New contributor




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





New contributor





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






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








  • 1




    I'd love to see a more informative title to this question!
    – Jeff Schaller
    29 mins ago






  • 2




    please please do not post images of text. Or, if you must, at least don't post such sparse images, and make them more helpful in the context of the question.
    – DopeGhoti
    14 mins ago














  • 1




    I'd love to see a more informative title to this question!
    – Jeff Schaller
    29 mins ago






  • 2




    please please do not post images of text. Or, if you must, at least don't post such sparse images, and make them more helpful in the context of the question.
    – DopeGhoti
    14 mins ago








1




1




I'd love to see a more informative title to this question!
– Jeff Schaller
29 mins ago




I'd love to see a more informative title to this question!
– Jeff Schaller
29 mins ago




2




2




please please do not post images of text. Or, if you must, at least don't post such sparse images, and make them more helpful in the context of the question.
– DopeGhoti
14 mins ago




please please do not post images of text. Or, if you must, at least don't post such sparse images, and make them more helpful in the context of the question.
– DopeGhoti
14 mins ago










3 Answers
3






active

oldest

votes


















0














#!/bin/sh

files_per_dir=500

set -- file_*

printf 'There are %d filesn' "$#"
printf 'Putting %d files in each new directoryn' "$files_per_dir"

N=0 # directory counter
n=0 # file counter

for filename do

if [ "$(( n % files_per_dir ))" -eq 0 ]; then
N=$(( N + 1 ))
dir="dir_$N"
printf 'Creating directory %sn' "$dir"
# mkdir "$dir"
fi

n=$(( n + 1 ))

printf 'Moving %s to %sn' "$filename" "$dir"
# mv -i -- "$filename" "$dir"

done


The above would put 500 files into each directory (the actual command that changes things have been commented out for safety). The filenames are assumed to match file_* and each new directory will be called dir_N where N is a positive integer.



If you want to move the files based on their numerical names (the above sorts the files in lexicographical order), then use



printf 'Moving %s to %dn' "file_$n" "$dir"
# mv -i -- "file_$n" "$dir"


instead (i.e. replace the corresponding two lines in the first script with these, in this order).






share|improve this answer





























    0














    cd lotsafiles
    for i in {1..20000}; do
    dirnum="$(((i/500)+1))"
    mkdir "dir_${dirnum}"
    mv "file${i}.png" "dir_${dirnum}"/
    done





    share|improve this answer































      -1














      Something simple along the lines of:



      #!/bin/bash
      typeset -i i
      typeset -i j
      typeset -i k

      i=0
      j=0
      k=0
      mkdir dir_$j
      for file in * ; do
      i=$i+1
      k=$k+1
      if [ $i = 500 ] ; then
      j=$j+1
      i=0
      mkdir dir_$j
      fi
      mv "$file" dir_$j/file_$k
      done


      Not tested, so you might put an echo in front of the mv "$file" dir_$j to see if it does what you want. Anyway it will give you an idea of how to do what you want.






      share|improve this answer





















      • Yes it works. That's why the typeset -i is there. Yes, I use string comparison, but that also works. Would you prefer I put #!/bin/sh as first line?
        – Ljm Dullaart
        6 mins ago













      Your Answer








      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "106"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: false,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: null,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });






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










      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f493049%2fbreak-down-a-large-folder-into-multiple-subfolders-by-sequential-names%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      3 Answers
      3






      active

      oldest

      votes








      3 Answers
      3






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      0














      #!/bin/sh

      files_per_dir=500

      set -- file_*

      printf 'There are %d filesn' "$#"
      printf 'Putting %d files in each new directoryn' "$files_per_dir"

      N=0 # directory counter
      n=0 # file counter

      for filename do

      if [ "$(( n % files_per_dir ))" -eq 0 ]; then
      N=$(( N + 1 ))
      dir="dir_$N"
      printf 'Creating directory %sn' "$dir"
      # mkdir "$dir"
      fi

      n=$(( n + 1 ))

      printf 'Moving %s to %sn' "$filename" "$dir"
      # mv -i -- "$filename" "$dir"

      done


      The above would put 500 files into each directory (the actual command that changes things have been commented out for safety). The filenames are assumed to match file_* and each new directory will be called dir_N where N is a positive integer.



      If you want to move the files based on their numerical names (the above sorts the files in lexicographical order), then use



      printf 'Moving %s to %dn' "file_$n" "$dir"
      # mv -i -- "file_$n" "$dir"


      instead (i.e. replace the corresponding two lines in the first script with these, in this order).






      share|improve this answer


























        0














        #!/bin/sh

        files_per_dir=500

        set -- file_*

        printf 'There are %d filesn' "$#"
        printf 'Putting %d files in each new directoryn' "$files_per_dir"

        N=0 # directory counter
        n=0 # file counter

        for filename do

        if [ "$(( n % files_per_dir ))" -eq 0 ]; then
        N=$(( N + 1 ))
        dir="dir_$N"
        printf 'Creating directory %sn' "$dir"
        # mkdir "$dir"
        fi

        n=$(( n + 1 ))

        printf 'Moving %s to %sn' "$filename" "$dir"
        # mv -i -- "$filename" "$dir"

        done


        The above would put 500 files into each directory (the actual command that changes things have been commented out for safety). The filenames are assumed to match file_* and each new directory will be called dir_N where N is a positive integer.



        If you want to move the files based on their numerical names (the above sorts the files in lexicographical order), then use



        printf 'Moving %s to %dn' "file_$n" "$dir"
        # mv -i -- "file_$n" "$dir"


        instead (i.e. replace the corresponding two lines in the first script with these, in this order).






        share|improve this answer
























          0












          0








          0






          #!/bin/sh

          files_per_dir=500

          set -- file_*

          printf 'There are %d filesn' "$#"
          printf 'Putting %d files in each new directoryn' "$files_per_dir"

          N=0 # directory counter
          n=0 # file counter

          for filename do

          if [ "$(( n % files_per_dir ))" -eq 0 ]; then
          N=$(( N + 1 ))
          dir="dir_$N"
          printf 'Creating directory %sn' "$dir"
          # mkdir "$dir"
          fi

          n=$(( n + 1 ))

          printf 'Moving %s to %sn' "$filename" "$dir"
          # mv -i -- "$filename" "$dir"

          done


          The above would put 500 files into each directory (the actual command that changes things have been commented out for safety). The filenames are assumed to match file_* and each new directory will be called dir_N where N is a positive integer.



          If you want to move the files based on their numerical names (the above sorts the files in lexicographical order), then use



          printf 'Moving %s to %dn' "file_$n" "$dir"
          # mv -i -- "file_$n" "$dir"


          instead (i.e. replace the corresponding two lines in the first script with these, in this order).






          share|improve this answer












          #!/bin/sh

          files_per_dir=500

          set -- file_*

          printf 'There are %d filesn' "$#"
          printf 'Putting %d files in each new directoryn' "$files_per_dir"

          N=0 # directory counter
          n=0 # file counter

          for filename do

          if [ "$(( n % files_per_dir ))" -eq 0 ]; then
          N=$(( N + 1 ))
          dir="dir_$N"
          printf 'Creating directory %sn' "$dir"
          # mkdir "$dir"
          fi

          n=$(( n + 1 ))

          printf 'Moving %s to %sn' "$filename" "$dir"
          # mv -i -- "$filename" "$dir"

          done


          The above would put 500 files into each directory (the actual command that changes things have been commented out for safety). The filenames are assumed to match file_* and each new directory will be called dir_N where N is a positive integer.



          If you want to move the files based on their numerical names (the above sorts the files in lexicographical order), then use



          printf 'Moving %s to %dn' "file_$n" "$dir"
          # mv -i -- "file_$n" "$dir"


          instead (i.e. replace the corresponding two lines in the first script with these, in this order).







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered 10 mins ago









          KusalanandaKusalananda

          122k16230375




          122k16230375

























              0














              cd lotsafiles
              for i in {1..20000}; do
              dirnum="$(((i/500)+1))"
              mkdir "dir_${dirnum}"
              mv "file${i}.png" "dir_${dirnum}"/
              done





              share|improve this answer




























                0














                cd lotsafiles
                for i in {1..20000}; do
                dirnum="$(((i/500)+1))"
                mkdir "dir_${dirnum}"
                mv "file${i}.png" "dir_${dirnum}"/
                done





                share|improve this answer


























                  0












                  0








                  0






                  cd lotsafiles
                  for i in {1..20000}; do
                  dirnum="$(((i/500)+1))"
                  mkdir "dir_${dirnum}"
                  mv "file${i}.png" "dir_${dirnum}"/
                  done





                  share|improve this answer














                  cd lotsafiles
                  for i in {1..20000}; do
                  dirnum="$(((i/500)+1))"
                  mkdir "dir_${dirnum}"
                  mv "file${i}.png" "dir_${dirnum}"/
                  done






                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited 6 mins ago









                  Kusalananda

                  122k16230375




                  122k16230375










                  answered 14 mins ago









                  DopeGhotiDopeGhoti

                  43.5k55382




                  43.5k55382























                      -1














                      Something simple along the lines of:



                      #!/bin/bash
                      typeset -i i
                      typeset -i j
                      typeset -i k

                      i=0
                      j=0
                      k=0
                      mkdir dir_$j
                      for file in * ; do
                      i=$i+1
                      k=$k+1
                      if [ $i = 500 ] ; then
                      j=$j+1
                      i=0
                      mkdir dir_$j
                      fi
                      mv "$file" dir_$j/file_$k
                      done


                      Not tested, so you might put an echo in front of the mv "$file" dir_$j to see if it does what you want. Anyway it will give you an idea of how to do what you want.






                      share|improve this answer





















                      • Yes it works. That's why the typeset -i is there. Yes, I use string comparison, but that also works. Would you prefer I put #!/bin/sh as first line?
                        – Ljm Dullaart
                        6 mins ago


















                      -1














                      Something simple along the lines of:



                      #!/bin/bash
                      typeset -i i
                      typeset -i j
                      typeset -i k

                      i=0
                      j=0
                      k=0
                      mkdir dir_$j
                      for file in * ; do
                      i=$i+1
                      k=$k+1
                      if [ $i = 500 ] ; then
                      j=$j+1
                      i=0
                      mkdir dir_$j
                      fi
                      mv "$file" dir_$j/file_$k
                      done


                      Not tested, so you might put an echo in front of the mv "$file" dir_$j to see if it does what you want. Anyway it will give you an idea of how to do what you want.






                      share|improve this answer





















                      • Yes it works. That's why the typeset -i is there. Yes, I use string comparison, but that also works. Would you prefer I put #!/bin/sh as first line?
                        – Ljm Dullaart
                        6 mins ago
















                      -1












                      -1








                      -1






                      Something simple along the lines of:



                      #!/bin/bash
                      typeset -i i
                      typeset -i j
                      typeset -i k

                      i=0
                      j=0
                      k=0
                      mkdir dir_$j
                      for file in * ; do
                      i=$i+1
                      k=$k+1
                      if [ $i = 500 ] ; then
                      j=$j+1
                      i=0
                      mkdir dir_$j
                      fi
                      mv "$file" dir_$j/file_$k
                      done


                      Not tested, so you might put an echo in front of the mv "$file" dir_$j to see if it does what you want. Anyway it will give you an idea of how to do what you want.






                      share|improve this answer












                      Something simple along the lines of:



                      #!/bin/bash
                      typeset -i i
                      typeset -i j
                      typeset -i k

                      i=0
                      j=0
                      k=0
                      mkdir dir_$j
                      for file in * ; do
                      i=$i+1
                      k=$k+1
                      if [ $i = 500 ] ; then
                      j=$j+1
                      i=0
                      mkdir dir_$j
                      fi
                      mv "$file" dir_$j/file_$k
                      done


                      Not tested, so you might put an echo in front of the mv "$file" dir_$j to see if it does what you want. Anyway it will give you an idea of how to do what you want.







                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered 13 mins ago









                      Ljm DullaartLjm Dullaart

                      58817




                      58817












                      • Yes it works. That's why the typeset -i is there. Yes, I use string comparison, but that also works. Would you prefer I put #!/bin/sh as first line?
                        – Ljm Dullaart
                        6 mins ago




















                      • Yes it works. That's why the typeset -i is there. Yes, I use string comparison, but that also works. Would you prefer I put #!/bin/sh as first line?
                        – Ljm Dullaart
                        6 mins ago


















                      Yes it works. That's why the typeset -i is there. Yes, I use string comparison, but that also works. Would you prefer I put #!/bin/sh as first line?
                      – Ljm Dullaart
                      6 mins ago






                      Yes it works. That's why the typeset -i is there. Yes, I use string comparison, but that also works. Would you prefer I put #!/bin/sh as first line?
                      – Ljm Dullaart
                      6 mins ago












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










                      draft saved

                      draft discarded


















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













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












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
















                      Thanks for contributing an answer to Unix & Linux Stack Exchange!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.





                      Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                      Please pay close attention to the following guidance:


                      • 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%2f493049%2fbreak-down-a-large-folder-into-multiple-subfolders-by-sequential-names%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

                      CARDNET

                      Boot-repair Failure: Unable to locate package grub-common:i386

                      濃尾地震