move files based on content

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP












-1















I want to move all files that contain a number greater than 25 (at least on one instance) but don't contain any number smaller than 25 after the string >randomnumber_xxx_ to a specific folder.



Example of a file that needs to be moved:



>23424_xxx_26
>331134_xxx_27
>6634_xxx_30


Example of a file that doesn't need to be moved:



>22234_xxx_20
>434534_xxx_27









share|improve this question


























    -1















    I want to move all files that contain a number greater than 25 (at least on one instance) but don't contain any number smaller than 25 after the string >randomnumber_xxx_ to a specific folder.



    Example of a file that needs to be moved:



    >23424_xxx_26
    >331134_xxx_27
    >6634_xxx_30


    Example of a file that doesn't need to be moved:



    >22234_xxx_20
    >434534_xxx_27









    share|improve this question
























      -1












      -1








      -1








      I want to move all files that contain a number greater than 25 (at least on one instance) but don't contain any number smaller than 25 after the string >randomnumber_xxx_ to a specific folder.



      Example of a file that needs to be moved:



      >23424_xxx_26
      >331134_xxx_27
      >6634_xxx_30


      Example of a file that doesn't need to be moved:



      >22234_xxx_20
      >434534_xxx_27









      share|improve this question














      I want to move all files that contain a number greater than 25 (at least on one instance) but don't contain any number smaller than 25 after the string >randomnumber_xxx_ to a specific folder.



      Example of a file that needs to be moved:



      >23424_xxx_26
      >331134_xxx_27
      >6634_xxx_30


      Example of a file that doesn't need to be moved:



      >22234_xxx_20
      >434534_xxx_27






      text-processing files






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Feb 20 at 6:11









      holahola

      31




      31




















          1 Answer
          1






          active

          oldest

          votes


















          0














          So, the first issue is to detect the files that needs to be moved.



          This could be done using grep:



          grep -q -E '^>.*_(1?[0-9]|2[0-4])$'
          grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$'


          These commands would return true if the input data contained a line that matched the given extended regular expressions.



          The expression _(1?[0-9]|2[0-4])$ would match any positive integer less than 25 occurring at the end of a line after an underscore, and _(2[5-9]|[3-9][0-9]|[0-9]3,)$ matches any positive integer greater than or equal to 25 at the end of the line after an underscore (assuming there are no zero-filled integers such as 002). We also match the > at the start of the line. The -q option would stop grep from actually outputting anything (we're only interested in whether we could find one of these lines or not).



          For a file to be copied, the first grep must return false and the second grep must return true.



          Applying this to each file of a directory (in this case regardless of what the files are called as you did not say anything about this):



          for filename in ./*; do
          [ ! -f "$filename" ] && continue

          if ! grep -q -E '^>.*_(1?[0-9]|2[0-4])$' "$filename" &&
          grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$' "$filename"
          then
          mv -i "$filename" /some/destination
          fi
          done


          This would move the files that fulfil the requirements to some destination directory at /some/destination. The -i option to mv would cause the utility to ask for confirmation before overwriting an already existing file with the same name as the file being moved.



          The first [ ! -f ... ] test in the loop would skip anything in the directory that is not a regular file (or a symbolic link to a regular file).






          share|improve this answer

























          • echo 001 | grep -Ee "[0-9]3," it will match 001, which is less than 25.

            – Prvt_Yadv
            Feb 20 at 8:03












          • @PRY With the added assumption about integers that are not zero-filled, I think this should be ok.

            – Kusalananda
            Feb 20 at 8:10












          • Worked great. Thanks!

            – hola
            Feb 20 at 16:39










          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%2f501772%2fmove-files-based-on-content%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          0














          So, the first issue is to detect the files that needs to be moved.



          This could be done using grep:



          grep -q -E '^>.*_(1?[0-9]|2[0-4])$'
          grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$'


          These commands would return true if the input data contained a line that matched the given extended regular expressions.



          The expression _(1?[0-9]|2[0-4])$ would match any positive integer less than 25 occurring at the end of a line after an underscore, and _(2[5-9]|[3-9][0-9]|[0-9]3,)$ matches any positive integer greater than or equal to 25 at the end of the line after an underscore (assuming there are no zero-filled integers such as 002). We also match the > at the start of the line. The -q option would stop grep from actually outputting anything (we're only interested in whether we could find one of these lines or not).



          For a file to be copied, the first grep must return false and the second grep must return true.



          Applying this to each file of a directory (in this case regardless of what the files are called as you did not say anything about this):



          for filename in ./*; do
          [ ! -f "$filename" ] && continue

          if ! grep -q -E '^>.*_(1?[0-9]|2[0-4])$' "$filename" &&
          grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$' "$filename"
          then
          mv -i "$filename" /some/destination
          fi
          done


          This would move the files that fulfil the requirements to some destination directory at /some/destination. The -i option to mv would cause the utility to ask for confirmation before overwriting an already existing file with the same name as the file being moved.



          The first [ ! -f ... ] test in the loop would skip anything in the directory that is not a regular file (or a symbolic link to a regular file).






          share|improve this answer

























          • echo 001 | grep -Ee "[0-9]3," it will match 001, which is less than 25.

            – Prvt_Yadv
            Feb 20 at 8:03












          • @PRY With the added assumption about integers that are not zero-filled, I think this should be ok.

            – Kusalananda
            Feb 20 at 8:10












          • Worked great. Thanks!

            – hola
            Feb 20 at 16:39















          0














          So, the first issue is to detect the files that needs to be moved.



          This could be done using grep:



          grep -q -E '^>.*_(1?[0-9]|2[0-4])$'
          grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$'


          These commands would return true if the input data contained a line that matched the given extended regular expressions.



          The expression _(1?[0-9]|2[0-4])$ would match any positive integer less than 25 occurring at the end of a line after an underscore, and _(2[5-9]|[3-9][0-9]|[0-9]3,)$ matches any positive integer greater than or equal to 25 at the end of the line after an underscore (assuming there are no zero-filled integers such as 002). We also match the > at the start of the line. The -q option would stop grep from actually outputting anything (we're only interested in whether we could find one of these lines or not).



          For a file to be copied, the first grep must return false and the second grep must return true.



          Applying this to each file of a directory (in this case regardless of what the files are called as you did not say anything about this):



          for filename in ./*; do
          [ ! -f "$filename" ] && continue

          if ! grep -q -E '^>.*_(1?[0-9]|2[0-4])$' "$filename" &&
          grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$' "$filename"
          then
          mv -i "$filename" /some/destination
          fi
          done


          This would move the files that fulfil the requirements to some destination directory at /some/destination. The -i option to mv would cause the utility to ask for confirmation before overwriting an already existing file with the same name as the file being moved.



          The first [ ! -f ... ] test in the loop would skip anything in the directory that is not a regular file (or a symbolic link to a regular file).






          share|improve this answer

























          • echo 001 | grep -Ee "[0-9]3," it will match 001, which is less than 25.

            – Prvt_Yadv
            Feb 20 at 8:03












          • @PRY With the added assumption about integers that are not zero-filled, I think this should be ok.

            – Kusalananda
            Feb 20 at 8:10












          • Worked great. Thanks!

            – hola
            Feb 20 at 16:39













          0












          0








          0







          So, the first issue is to detect the files that needs to be moved.



          This could be done using grep:



          grep -q -E '^>.*_(1?[0-9]|2[0-4])$'
          grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$'


          These commands would return true if the input data contained a line that matched the given extended regular expressions.



          The expression _(1?[0-9]|2[0-4])$ would match any positive integer less than 25 occurring at the end of a line after an underscore, and _(2[5-9]|[3-9][0-9]|[0-9]3,)$ matches any positive integer greater than or equal to 25 at the end of the line after an underscore (assuming there are no zero-filled integers such as 002). We also match the > at the start of the line. The -q option would stop grep from actually outputting anything (we're only interested in whether we could find one of these lines or not).



          For a file to be copied, the first grep must return false and the second grep must return true.



          Applying this to each file of a directory (in this case regardless of what the files are called as you did not say anything about this):



          for filename in ./*; do
          [ ! -f "$filename" ] && continue

          if ! grep -q -E '^>.*_(1?[0-9]|2[0-4])$' "$filename" &&
          grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$' "$filename"
          then
          mv -i "$filename" /some/destination
          fi
          done


          This would move the files that fulfil the requirements to some destination directory at /some/destination. The -i option to mv would cause the utility to ask for confirmation before overwriting an already existing file with the same name as the file being moved.



          The first [ ! -f ... ] test in the loop would skip anything in the directory that is not a regular file (or a symbolic link to a regular file).






          share|improve this answer















          So, the first issue is to detect the files that needs to be moved.



          This could be done using grep:



          grep -q -E '^>.*_(1?[0-9]|2[0-4])$'
          grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$'


          These commands would return true if the input data contained a line that matched the given extended regular expressions.



          The expression _(1?[0-9]|2[0-4])$ would match any positive integer less than 25 occurring at the end of a line after an underscore, and _(2[5-9]|[3-9][0-9]|[0-9]3,)$ matches any positive integer greater than or equal to 25 at the end of the line after an underscore (assuming there are no zero-filled integers such as 002). We also match the > at the start of the line. The -q option would stop grep from actually outputting anything (we're only interested in whether we could find one of these lines or not).



          For a file to be copied, the first grep must return false and the second grep must return true.



          Applying this to each file of a directory (in this case regardless of what the files are called as you did not say anything about this):



          for filename in ./*; do
          [ ! -f "$filename" ] && continue

          if ! grep -q -E '^>.*_(1?[0-9]|2[0-4])$' "$filename" &&
          grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$' "$filename"
          then
          mv -i "$filename" /some/destination
          fi
          done


          This would move the files that fulfil the requirements to some destination directory at /some/destination. The -i option to mv would cause the utility to ask for confirmation before overwriting an already existing file with the same name as the file being moved.



          The first [ ! -f ... ] test in the loop would skip anything in the directory that is not a regular file (or a symbolic link to a regular file).







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Feb 20 at 8:10

























          answered Feb 20 at 7:54









          KusalanandaKusalananda

          135k17256424




          135k17256424












          • echo 001 | grep -Ee "[0-9]3," it will match 001, which is less than 25.

            – Prvt_Yadv
            Feb 20 at 8:03












          • @PRY With the added assumption about integers that are not zero-filled, I think this should be ok.

            – Kusalananda
            Feb 20 at 8:10












          • Worked great. Thanks!

            – hola
            Feb 20 at 16:39

















          • echo 001 | grep -Ee "[0-9]3," it will match 001, which is less than 25.

            – Prvt_Yadv
            Feb 20 at 8:03












          • @PRY With the added assumption about integers that are not zero-filled, I think this should be ok.

            – Kusalananda
            Feb 20 at 8:10












          • Worked great. Thanks!

            – hola
            Feb 20 at 16:39
















          echo 001 | grep -Ee "[0-9]3," it will match 001, which is less than 25.

          – Prvt_Yadv
          Feb 20 at 8:03






          echo 001 | grep -Ee "[0-9]3," it will match 001, which is less than 25.

          – Prvt_Yadv
          Feb 20 at 8:03














          @PRY With the added assumption about integers that are not zero-filled, I think this should be ok.

          – Kusalananda
          Feb 20 at 8:10






          @PRY With the added assumption about integers that are not zero-filled, I think this should be ok.

          – Kusalananda
          Feb 20 at 8:10














          Worked great. Thanks!

          – hola
          Feb 20 at 16:39





          Worked great. Thanks!

          – hola
          Feb 20 at 16:39

















          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%2f501772%2fmove-files-based-on-content%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

          How to check contact read email or not when send email to Individual?

          Bahrain

          Postfix configuration issue with fips on centos 7; mailgun relay