Delete files with regular expression












29















I Tried to delete files that starts with A and ends with 2 numbers but It doesn't do a thing.

What I tried:



rm ^A*[0..9]2$


Where am I wrong?










share|improve this question



























    29















    I Tried to delete files that starts with A and ends with 2 numbers but It doesn't do a thing.

    What I tried:



    rm ^A*[0..9]2$


    Where am I wrong?










    share|improve this question

























      29












      29








      29


      19






      I Tried to delete files that starts with A and ends with 2 numbers but It doesn't do a thing.

      What I tried:



      rm ^A*[0..9]2$


      Where am I wrong?










      share|improve this question














      I Tried to delete files that starts with A and ends with 2 numbers but It doesn't do a thing.

      What I tried:



      rm ^A*[0..9]2$


      Where am I wrong?







      bash unix regex rm






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Feb 22 '12 at 18:07









      gdorongdoron

      2651310




      2651310






















          5 Answers
          5






          active

          oldest

          votes


















          41














          You can use the following command to delete all files matching your criteria:



          ls | grep -P "^A.*[0-9]{2}$" | xargs -d"n" rm


          How it works:




          1. ls lists all files (one by line since the result is piped).



          2. grep -P "^A.*[0-9]{2}$" filters the list of files and leaves only those that match the regular expression ^A.*[0-9]{2}$




            • .* indicates any number of occurrences of ., where . is a wildcard matching any character.


            • [0-9]{2} indicates exactly two occurrences of [0-9], that is, any digit.




          3. xargs -d"n" rm executes rm line once for every line that is piped to it.




          Where am I wrong?




          For starters, rm doesn't accept a regular expression as an argument. Besides the wildcard *, every other character is treated literally.



          Also, your regular expression is slightly off. For example, * means any occurrences of ... in a regular expression, so A* matches A, AA, etc. and even an empty string.



          For more information, visit Regular-Expressions.info.






          share|improve this answer





















          • 2





            Beware of spaces in file names.

            – slhck
            Feb 22 '12 at 18:27






          • 1





            The -d"n switch fixes the spaces problem.

            – Frg
            Feb 22 '12 at 19:14






          • 1





            Note - some distros (like Mac OS) don't have a grep -P (Perl regex). grep -E may work in this case.

            – bluescrubbie
            Oct 2 '13 at 20:59











          • I prefer using -I with xargs and always test with non-lethal commands first: xargs -d"n" -I {} echo "{}"

            – jozxyqk
            Mar 24 '14 at 5:40






          • 1





            Parsing ls? See this question which points to this article. Because of the pitfalls you may rm what you don't want to.

            – Kamil Maciorowski
            Nov 15 '16 at 11:57



















          37














          Or using find:



          find your-directory/ -name 'A*[0-9][0-9]' -delete


          This solution will deal with weird file names.






          share|improve this answer



















          • 3





            This is a great solution. I prefer it because it is simpler and you can omit the -delete flag at the end first to see if your regex is correct before mass deleting your files.

            – JAMESSTONEco
            Apr 14 '15 at 21:31






          • 1





            Furthermore you have more control on what you delete, for example adding -type f

            – Marco Sulla
            Jun 8 '16 at 8:12











          • Can this be used to delete files and folders? It does not work for non empty folders.

            – Alex
            Sep 9 '17 at 11:46











          • @Alex nope, the directory must be empty (it wasn't an OP requirement anyway), you can use the xargs approach with rm -f.

            – cYrus
            Sep 9 '17 at 13:54



















          10














          See the filename expansion section of the bash man page:



          rm A*[0-9][0-9]





          share|improve this answer
























          • worked nicely for me.

            – Nishanth Matha
            Mar 15 '17 at 6:09











          • This was the simplest, yet complete answer to the question.

            – Janac Meena
            Oct 17 '17 at 17:22



















          1














          The solution with regexp is 200 times better, even with that you can see which file will be deleted before using the command, cutting off the final pipe:



          ls | grep -P "^A.*[0-9]{2}$"


          Then if it's correct just use:



          ls | grep -P "^A.*[0-9]{2}$" | xargs -d "n" rm


          This is 200 times better because if you work with Unix it's important to know how to use grep. It's very powerful if you know how to use it.






          share|improve this answer


























          • This doesn't seem to add much beyond what Dennis's 4 year old answer already says.

            – 8bittree
            Nov 16 '16 at 19:48











          • "200 times" is a pretty specific. Lots of other commands are very powerful too, all you need to do is learn how to use them.

            – glenn jackman
            Mar 15 '17 at 11:22



















          -1














          This works on my mac:



          rm $(ls | grep -e '^A*[0..9]2$')






          share|improve this answer































            5 Answers
            5






            active

            oldest

            votes








            5 Answers
            5






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            41














            You can use the following command to delete all files matching your criteria:



            ls | grep -P "^A.*[0-9]{2}$" | xargs -d"n" rm


            How it works:




            1. ls lists all files (one by line since the result is piped).



            2. grep -P "^A.*[0-9]{2}$" filters the list of files and leaves only those that match the regular expression ^A.*[0-9]{2}$




              • .* indicates any number of occurrences of ., where . is a wildcard matching any character.


              • [0-9]{2} indicates exactly two occurrences of [0-9], that is, any digit.




            3. xargs -d"n" rm executes rm line once for every line that is piped to it.




            Where am I wrong?




            For starters, rm doesn't accept a regular expression as an argument. Besides the wildcard *, every other character is treated literally.



            Also, your regular expression is slightly off. For example, * means any occurrences of ... in a regular expression, so A* matches A, AA, etc. and even an empty string.



            For more information, visit Regular-Expressions.info.






            share|improve this answer





















            • 2





              Beware of spaces in file names.

              – slhck
              Feb 22 '12 at 18:27






            • 1





              The -d"n switch fixes the spaces problem.

              – Frg
              Feb 22 '12 at 19:14






            • 1





              Note - some distros (like Mac OS) don't have a grep -P (Perl regex). grep -E may work in this case.

              – bluescrubbie
              Oct 2 '13 at 20:59











            • I prefer using -I with xargs and always test with non-lethal commands first: xargs -d"n" -I {} echo "{}"

              – jozxyqk
              Mar 24 '14 at 5:40






            • 1





              Parsing ls? See this question which points to this article. Because of the pitfalls you may rm what you don't want to.

              – Kamil Maciorowski
              Nov 15 '16 at 11:57
















            41














            You can use the following command to delete all files matching your criteria:



            ls | grep -P "^A.*[0-9]{2}$" | xargs -d"n" rm


            How it works:




            1. ls lists all files (one by line since the result is piped).



            2. grep -P "^A.*[0-9]{2}$" filters the list of files and leaves only those that match the regular expression ^A.*[0-9]{2}$




              • .* indicates any number of occurrences of ., where . is a wildcard matching any character.


              • [0-9]{2} indicates exactly two occurrences of [0-9], that is, any digit.




            3. xargs -d"n" rm executes rm line once for every line that is piped to it.




            Where am I wrong?




            For starters, rm doesn't accept a regular expression as an argument. Besides the wildcard *, every other character is treated literally.



            Also, your regular expression is slightly off. For example, * means any occurrences of ... in a regular expression, so A* matches A, AA, etc. and even an empty string.



            For more information, visit Regular-Expressions.info.






            share|improve this answer





















            • 2





              Beware of spaces in file names.

              – slhck
              Feb 22 '12 at 18:27






            • 1





              The -d"n switch fixes the spaces problem.

              – Frg
              Feb 22 '12 at 19:14






            • 1





              Note - some distros (like Mac OS) don't have a grep -P (Perl regex). grep -E may work in this case.

              – bluescrubbie
              Oct 2 '13 at 20:59











            • I prefer using -I with xargs and always test with non-lethal commands first: xargs -d"n" -I {} echo "{}"

              – jozxyqk
              Mar 24 '14 at 5:40






            • 1





              Parsing ls? See this question which points to this article. Because of the pitfalls you may rm what you don't want to.

              – Kamil Maciorowski
              Nov 15 '16 at 11:57














            41












            41








            41







            You can use the following command to delete all files matching your criteria:



            ls | grep -P "^A.*[0-9]{2}$" | xargs -d"n" rm


            How it works:




            1. ls lists all files (one by line since the result is piped).



            2. grep -P "^A.*[0-9]{2}$" filters the list of files and leaves only those that match the regular expression ^A.*[0-9]{2}$




              • .* indicates any number of occurrences of ., where . is a wildcard matching any character.


              • [0-9]{2} indicates exactly two occurrences of [0-9], that is, any digit.




            3. xargs -d"n" rm executes rm line once for every line that is piped to it.




            Where am I wrong?




            For starters, rm doesn't accept a regular expression as an argument. Besides the wildcard *, every other character is treated literally.



            Also, your regular expression is slightly off. For example, * means any occurrences of ... in a regular expression, so A* matches A, AA, etc. and even an empty string.



            For more information, visit Regular-Expressions.info.






            share|improve this answer















            You can use the following command to delete all files matching your criteria:



            ls | grep -P "^A.*[0-9]{2}$" | xargs -d"n" rm


            How it works:




            1. ls lists all files (one by line since the result is piped).



            2. grep -P "^A.*[0-9]{2}$" filters the list of files and leaves only those that match the regular expression ^A.*[0-9]{2}$




              • .* indicates any number of occurrences of ., where . is a wildcard matching any character.


              • [0-9]{2} indicates exactly two occurrences of [0-9], that is, any digit.




            3. xargs -d"n" rm executes rm line once for every line that is piped to it.




            Where am I wrong?




            For starters, rm doesn't accept a regular expression as an argument. Besides the wildcard *, every other character is treated literally.



            Also, your regular expression is slightly off. For example, * means any occurrences of ... in a regular expression, so A* matches A, AA, etc. and even an empty string.



            For more information, visit Regular-Expressions.info.







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Feb 22 '12 at 18:41

























            answered Feb 22 '12 at 18:19









            DennisDennis

            40.6k6101136




            40.6k6101136








            • 2





              Beware of spaces in file names.

              – slhck
              Feb 22 '12 at 18:27






            • 1





              The -d"n switch fixes the spaces problem.

              – Frg
              Feb 22 '12 at 19:14






            • 1





              Note - some distros (like Mac OS) don't have a grep -P (Perl regex). grep -E may work in this case.

              – bluescrubbie
              Oct 2 '13 at 20:59











            • I prefer using -I with xargs and always test with non-lethal commands first: xargs -d"n" -I {} echo "{}"

              – jozxyqk
              Mar 24 '14 at 5:40






            • 1





              Parsing ls? See this question which points to this article. Because of the pitfalls you may rm what you don't want to.

              – Kamil Maciorowski
              Nov 15 '16 at 11:57














            • 2





              Beware of spaces in file names.

              – slhck
              Feb 22 '12 at 18:27






            • 1





              The -d"n switch fixes the spaces problem.

              – Frg
              Feb 22 '12 at 19:14






            • 1





              Note - some distros (like Mac OS) don't have a grep -P (Perl regex). grep -E may work in this case.

              – bluescrubbie
              Oct 2 '13 at 20:59











            • I prefer using -I with xargs and always test with non-lethal commands first: xargs -d"n" -I {} echo "{}"

              – jozxyqk
              Mar 24 '14 at 5:40






            • 1





              Parsing ls? See this question which points to this article. Because of the pitfalls you may rm what you don't want to.

              – Kamil Maciorowski
              Nov 15 '16 at 11:57








            2




            2





            Beware of spaces in file names.

            – slhck
            Feb 22 '12 at 18:27





            Beware of spaces in file names.

            – slhck
            Feb 22 '12 at 18:27




            1




            1





            The -d"n switch fixes the spaces problem.

            – Frg
            Feb 22 '12 at 19:14





            The -d"n switch fixes the spaces problem.

            – Frg
            Feb 22 '12 at 19:14




            1




            1





            Note - some distros (like Mac OS) don't have a grep -P (Perl regex). grep -E may work in this case.

            – bluescrubbie
            Oct 2 '13 at 20:59





            Note - some distros (like Mac OS) don't have a grep -P (Perl regex). grep -E may work in this case.

            – bluescrubbie
            Oct 2 '13 at 20:59













            I prefer using -I with xargs and always test with non-lethal commands first: xargs -d"n" -I {} echo "{}"

            – jozxyqk
            Mar 24 '14 at 5:40





            I prefer using -I with xargs and always test with non-lethal commands first: xargs -d"n" -I {} echo "{}"

            – jozxyqk
            Mar 24 '14 at 5:40




            1




            1





            Parsing ls? See this question which points to this article. Because of the pitfalls you may rm what you don't want to.

            – Kamil Maciorowski
            Nov 15 '16 at 11:57





            Parsing ls? See this question which points to this article. Because of the pitfalls you may rm what you don't want to.

            – Kamil Maciorowski
            Nov 15 '16 at 11:57













            37














            Or using find:



            find your-directory/ -name 'A*[0-9][0-9]' -delete


            This solution will deal with weird file names.






            share|improve this answer



















            • 3





              This is a great solution. I prefer it because it is simpler and you can omit the -delete flag at the end first to see if your regex is correct before mass deleting your files.

              – JAMESSTONEco
              Apr 14 '15 at 21:31






            • 1





              Furthermore you have more control on what you delete, for example adding -type f

              – Marco Sulla
              Jun 8 '16 at 8:12











            • Can this be used to delete files and folders? It does not work for non empty folders.

              – Alex
              Sep 9 '17 at 11:46











            • @Alex nope, the directory must be empty (it wasn't an OP requirement anyway), you can use the xargs approach with rm -f.

              – cYrus
              Sep 9 '17 at 13:54
















            37














            Or using find:



            find your-directory/ -name 'A*[0-9][0-9]' -delete


            This solution will deal with weird file names.






            share|improve this answer



















            • 3





              This is a great solution. I prefer it because it is simpler and you can omit the -delete flag at the end first to see if your regex is correct before mass deleting your files.

              – JAMESSTONEco
              Apr 14 '15 at 21:31






            • 1





              Furthermore you have more control on what you delete, for example adding -type f

              – Marco Sulla
              Jun 8 '16 at 8:12











            • Can this be used to delete files and folders? It does not work for non empty folders.

              – Alex
              Sep 9 '17 at 11:46











            • @Alex nope, the directory must be empty (it wasn't an OP requirement anyway), you can use the xargs approach with rm -f.

              – cYrus
              Sep 9 '17 at 13:54














            37












            37








            37







            Or using find:



            find your-directory/ -name 'A*[0-9][0-9]' -delete


            This solution will deal with weird file names.






            share|improve this answer













            Or using find:



            find your-directory/ -name 'A*[0-9][0-9]' -delete


            This solution will deal with weird file names.







            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Feb 22 '12 at 19:01









            cYruscYrus

            15.9k55369




            15.9k55369








            • 3





              This is a great solution. I prefer it because it is simpler and you can omit the -delete flag at the end first to see if your regex is correct before mass deleting your files.

              – JAMESSTONEco
              Apr 14 '15 at 21:31






            • 1





              Furthermore you have more control on what you delete, for example adding -type f

              – Marco Sulla
              Jun 8 '16 at 8:12











            • Can this be used to delete files and folders? It does not work for non empty folders.

              – Alex
              Sep 9 '17 at 11:46











            • @Alex nope, the directory must be empty (it wasn't an OP requirement anyway), you can use the xargs approach with rm -f.

              – cYrus
              Sep 9 '17 at 13:54














            • 3





              This is a great solution. I prefer it because it is simpler and you can omit the -delete flag at the end first to see if your regex is correct before mass deleting your files.

              – JAMESSTONEco
              Apr 14 '15 at 21:31






            • 1





              Furthermore you have more control on what you delete, for example adding -type f

              – Marco Sulla
              Jun 8 '16 at 8:12











            • Can this be used to delete files and folders? It does not work for non empty folders.

              – Alex
              Sep 9 '17 at 11:46











            • @Alex nope, the directory must be empty (it wasn't an OP requirement anyway), you can use the xargs approach with rm -f.

              – cYrus
              Sep 9 '17 at 13:54








            3




            3





            This is a great solution. I prefer it because it is simpler and you can omit the -delete flag at the end first to see if your regex is correct before mass deleting your files.

            – JAMESSTONEco
            Apr 14 '15 at 21:31





            This is a great solution. I prefer it because it is simpler and you can omit the -delete flag at the end first to see if your regex is correct before mass deleting your files.

            – JAMESSTONEco
            Apr 14 '15 at 21:31




            1




            1





            Furthermore you have more control on what you delete, for example adding -type f

            – Marco Sulla
            Jun 8 '16 at 8:12





            Furthermore you have more control on what you delete, for example adding -type f

            – Marco Sulla
            Jun 8 '16 at 8:12













            Can this be used to delete files and folders? It does not work for non empty folders.

            – Alex
            Sep 9 '17 at 11:46





            Can this be used to delete files and folders? It does not work for non empty folders.

            – Alex
            Sep 9 '17 at 11:46













            @Alex nope, the directory must be empty (it wasn't an OP requirement anyway), you can use the xargs approach with rm -f.

            – cYrus
            Sep 9 '17 at 13:54





            @Alex nope, the directory must be empty (it wasn't an OP requirement anyway), you can use the xargs approach with rm -f.

            – cYrus
            Sep 9 '17 at 13:54











            10














            See the filename expansion section of the bash man page:



            rm A*[0-9][0-9]





            share|improve this answer
























            • worked nicely for me.

              – Nishanth Matha
              Mar 15 '17 at 6:09











            • This was the simplest, yet complete answer to the question.

              – Janac Meena
              Oct 17 '17 at 17:22
















            10














            See the filename expansion section of the bash man page:



            rm A*[0-9][0-9]





            share|improve this answer
























            • worked nicely for me.

              – Nishanth Matha
              Mar 15 '17 at 6:09











            • This was the simplest, yet complete answer to the question.

              – Janac Meena
              Oct 17 '17 at 17:22














            10












            10








            10







            See the filename expansion section of the bash man page:



            rm A*[0-9][0-9]





            share|improve this answer













            See the filename expansion section of the bash man page:



            rm A*[0-9][0-9]






            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Feb 22 '12 at 19:46









            glenn jackmanglenn jackman

            15.8k22644




            15.8k22644













            • worked nicely for me.

              – Nishanth Matha
              Mar 15 '17 at 6:09











            • This was the simplest, yet complete answer to the question.

              – Janac Meena
              Oct 17 '17 at 17:22



















            • worked nicely for me.

              – Nishanth Matha
              Mar 15 '17 at 6:09











            • This was the simplest, yet complete answer to the question.

              – Janac Meena
              Oct 17 '17 at 17:22

















            worked nicely for me.

            – Nishanth Matha
            Mar 15 '17 at 6:09





            worked nicely for me.

            – Nishanth Matha
            Mar 15 '17 at 6:09













            This was the simplest, yet complete answer to the question.

            – Janac Meena
            Oct 17 '17 at 17:22





            This was the simplest, yet complete answer to the question.

            – Janac Meena
            Oct 17 '17 at 17:22











            1














            The solution with regexp is 200 times better, even with that you can see which file will be deleted before using the command, cutting off the final pipe:



            ls | grep -P "^A.*[0-9]{2}$"


            Then if it's correct just use:



            ls | grep -P "^A.*[0-9]{2}$" | xargs -d "n" rm


            This is 200 times better because if you work with Unix it's important to know how to use grep. It's very powerful if you know how to use it.






            share|improve this answer


























            • This doesn't seem to add much beyond what Dennis's 4 year old answer already says.

              – 8bittree
              Nov 16 '16 at 19:48











            • "200 times" is a pretty specific. Lots of other commands are very powerful too, all you need to do is learn how to use them.

              – glenn jackman
              Mar 15 '17 at 11:22
















            1














            The solution with regexp is 200 times better, even with that you can see which file will be deleted before using the command, cutting off the final pipe:



            ls | grep -P "^A.*[0-9]{2}$"


            Then if it's correct just use:



            ls | grep -P "^A.*[0-9]{2}$" | xargs -d "n" rm


            This is 200 times better because if you work with Unix it's important to know how to use grep. It's very powerful if you know how to use it.






            share|improve this answer


























            • This doesn't seem to add much beyond what Dennis's 4 year old answer already says.

              – 8bittree
              Nov 16 '16 at 19:48











            • "200 times" is a pretty specific. Lots of other commands are very powerful too, all you need to do is learn how to use them.

              – glenn jackman
              Mar 15 '17 at 11:22














            1












            1








            1







            The solution with regexp is 200 times better, even with that you can see which file will be deleted before using the command, cutting off the final pipe:



            ls | grep -P "^A.*[0-9]{2}$"


            Then if it's correct just use:



            ls | grep -P "^A.*[0-9]{2}$" | xargs -d "n" rm


            This is 200 times better because if you work with Unix it's important to know how to use grep. It's very powerful if you know how to use it.






            share|improve this answer















            The solution with regexp is 200 times better, even with that you can see which file will be deleted before using the command, cutting off the final pipe:



            ls | grep -P "^A.*[0-9]{2}$"


            Then if it's correct just use:



            ls | grep -P "^A.*[0-9]{2}$" | xargs -d "n" rm


            This is 200 times better because if you work with Unix it's important to know how to use grep. It's very powerful if you know how to use it.







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Nov 11 '16 at 0:14









            3498DB

            15.7k114762




            15.7k114762










            answered Nov 10 '16 at 19:25









            SalvatoreSalvatore

            191




            191













            • This doesn't seem to add much beyond what Dennis's 4 year old answer already says.

              – 8bittree
              Nov 16 '16 at 19:48











            • "200 times" is a pretty specific. Lots of other commands are very powerful too, all you need to do is learn how to use them.

              – glenn jackman
              Mar 15 '17 at 11:22



















            • This doesn't seem to add much beyond what Dennis's 4 year old answer already says.

              – 8bittree
              Nov 16 '16 at 19:48











            • "200 times" is a pretty specific. Lots of other commands are very powerful too, all you need to do is learn how to use them.

              – glenn jackman
              Mar 15 '17 at 11:22

















            This doesn't seem to add much beyond what Dennis's 4 year old answer already says.

            – 8bittree
            Nov 16 '16 at 19:48





            This doesn't seem to add much beyond what Dennis's 4 year old answer already says.

            – 8bittree
            Nov 16 '16 at 19:48













            "200 times" is a pretty specific. Lots of other commands are very powerful too, all you need to do is learn how to use them.

            – glenn jackman
            Mar 15 '17 at 11:22





            "200 times" is a pretty specific. Lots of other commands are very powerful too, all you need to do is learn how to use them.

            – glenn jackman
            Mar 15 '17 at 11:22











            -1














            This works on my mac:



            rm $(ls | grep -e '^A*[0..9]2$')






            share|improve this answer




























              -1














              This works on my mac:



              rm $(ls | grep -e '^A*[0..9]2$')






              share|improve this answer


























                -1












                -1








                -1







                This works on my mac:



                rm $(ls | grep -e '^A*[0..9]2$')






                share|improve this answer













                This works on my mac:



                rm $(ls | grep -e '^A*[0..9]2$')







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Jan 9 at 13:35









                RayRay

                1




                1















                    Popular posts from this blog

                    flock() on closed filehandle LOCK_FILE at /usr/bin/apt-mirror

                    Mangá

                    Eduardo VII do Reino Unido