Linux / Unix: Find And Remove Files With One Command On Fly

last updated in Categories , ,

I am new to Unix and Linux command line. How do I find and delete files under Linux / UNIX operating systems using shell prompt?

Some time it is necessary to find out files and remove them. However, rm command does not support search criteria. You need to use the find command to search for files in a directory and remove them on fly. You can combine find and rm command together.

Linux or UNIX – Find and remove file syntax

The basic find command syntax is:

find dir-name criteria action

  1. dir-name : – Defines the working directory such as look into /tmp/
  2. criteria : Use to select files such as “*.sh”
  3. action : The find action (what-to-do on file) such as delete the file.

To remove multiple files such as *.jpg or *.sh with one command find, use:

find . -name "FILE-TO-FIND" -exec rm -rf {} \;


find . -type f -name "FILE-TO-FIND" -exec rm -f {} \;

The only difference between above two syntax is that the first command remove directories as well where second command only removes files. Options:

  1. -name "FILE-TO-FIND" : File pattern.
  2. -exec rm -rf {} \; : Delete all files matched by file pattern.
  3. -type f : Only match files and do not include directory names.

Examples of find command

WARNING! These examples may crash your computer if executed. Before removing file makes sure, you have backup of all-important files. Do not use rm command as root user it can do critical damage to the system.

Find all files having .bak (*.bak) extension in the current directory and remove them:
$ find . -type f -name "*.bak" -exec rm -f {} \;

Find all core files in the / (root) directory and remove them (be careful with this command):
# find / -name core -exec rm -f {} \;

Find all *.bak files in the current directory and removes them with confirmation from user:
$ find . -type f -name "*.bak" -exec rm -i {} \;
Sample outputs:

rm: remove regular empty file `./data0002.bak'? y
rm: remove regular empty file `./d234234234fsdf.bak'? y
rm: remove regular empty file `./backup-20-10-2005.bak'? n
See also : Other find command usage
  • For detailed information on find command please see finding/locating files with find command part # 1, Part # 2.
  • Man pages : rm(1)

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin, DevOps engineer, and a trainer for the Linux operating system/Unix shell scripting. Get the latest tutorials on SysAdmin, Linux/Unix and open source topics via RSS/XML feed or weekly email newsletter.

70 comment

  1. Awesome, this was exactly what I needed to delete a huge amount of files when I ran out of inodes. Just doing an rm * would result in an error, but this deletes the files one at a time. Thanks

  2. do any of the above commands delete .bak files recursively throughout an entire directory tree, or would I need to cd to each directory to delete its .bak files?

  3. Rob,

    > would I need to cd to each directory to delete its .bak files?

    find command will go to each sub directory. For example delete all *.bak from /data2 dir, use

    find /data2 -type f -name "*.bak" -exec rm -f {} \;

  4. Why does it require a backslash to terminate with the ;? I need to place this in an applescript under “do shell script” but it hates that backslash. Is there any way around it?

    1. 1) Maybe because it’s rather new and not widely known (yet), or possibly not yet available everywhere?
      2) Because it cannot delete non-empty directories, in case you want to do that.

      But generally: yes, one should also consider the “-delete” action.

  5. [root@localhost ieee80211-1.2.18]# make
    Checking in /lib/modules/2.6.18-53.el5xen for ieee80211 components…
    make -C /lib/modules/2.6.18-53.el5xen/build M=/root/Desktop/ieee80211-1.2.18 modules
    make[1]: Entering directory `/usr/src/kernels/2.6.18-53.el5-xen-i686′
    CC [M] /root/Desktop/ieee80211-1.2.18/ieee80211_module.o
    In file included from /root/Desktop/ieee80211-1.2.18/ieee80211_module.c:52:

    I am a linux newbie. I installed RHEL5 on a compaq Presario V3000 laptop.

    Now i tried to install the wifi drivers ipw3445… but i am stuck her

    error: redefinition of ‘kmemdup’
    include/linux/slab.h:208: error: previous definition of ‘kmemdup’ was here
    make[2]: *** [/root/Desktop/ieee80211-1.2.18/ieee80211_module.o] Error 1
    make[1]: *** [_module_/root/Desktop/ieee80211-1.2.18] Error 2
    make[1]: Leaving directory `/usr/src/kernels/2.6.18-53.el5-xen-i686′
    make: *** [modules] Error 2
    [root@localhost ieee80211-1.2.18]#

    Please help

    1. Did you ever find a solution to this problem. If so please let me know the details because I have the exact same issue. Thank you.

  6. How can I remove files that contain a certain string of text? For example: if file contains any of these symbols, remove the file:

    { }
    [ ]
    ( )

    Just to name a few, but there might be others. I need a bash script to do this.

  7. awesome…just awesome…- thank you :-) – freakin’ directory was hung…can’t ls to it for nothing or anything for that matter….but finally :-)

  8. What if I wanted to remove every file from my home account except for a certain directory??
    For example:
    find . -name ‘.UCLA’ -prune -o -exec rm -rf {} +;

    This removes everything EXCEPT my .UCLA folder, however I get a message that says:
    rm: error can not remove `.’ `..’

    How do I get rid of that error message?

  9. I’m trying to remove files that have a certain misc dates
    Would like to do a wild card for certain parts of the file name.
    Example – 03230800203805V274803.810

    Would ****08***********.810 work?

    Want to delete the files containing in the postions 5 and 6 for 08.


  10. Nobody has ever asked this question online it seems…

    Problem: Stupid MAC (which I dont have anymore named files with these characters:
    etc.. in the file names.. I could not find any file renamer that would rename these files in Windows/DOS..

    So I tried FENDORA linux and I can rename the manually one by one but i have hundreds…


    No RENAME or mv command works.. I trired everything i can find online..

    I tried specifing the “:” like this “\:” “\x3a” etc.. and nothing.

    does anyone know how to strip these retardted OS-illegal characters out of the names.. in one shot.?

    I know the ren command in DOS.. but I have no clue it seems in Linux.
    and no i don’t have a mac or access to one..

    Thanks ahead of time, for your help.

  11. This should do it:

    for FILE in `find . -name ‘*\:*’`; do NEW=`echo $FILE | sed -e ‘s/:/_/’`; mv $FILE $NEW; done

  12. Hi,

    I am trying to delete files and folders using the below command

    find /opt/server/Outward/logs/ -daystart \( -type d ! \) -mtime +264 -exec rm -rf {} \;
    I get the below error.
    find: /opt/server/Outward/logs/2009-02-04: No such file or directory

    The logs folder contains folders and sub-folders. After I execute the command i get the error message as above. What could be the possible reason and the solution.


  13. Does find’s -delete option support or have something similar to rm’s -f flag? (i.e. force delete a file/directory even if the write permission is not set)? I need to delete files that may not be write enabled (eg r– or r-x when viewed using ls -l).

  14. How to override after find command?
    Note :i know find command but dont know how to combine these operations.
    cat “I’m repled content” > .
    1> i have to find files with name “*test*.*” and replace the content of the file with “I’m replaced content”.
    2> find the file with size more than 10mb and replace the content of the file with “I’m replaced content”.

  15. Very nice find. Had a bunch of music I copied over from my Mac that had Ableton files in them which weren’t needed on my laptop.

    Quick way of getting rid of them.

    Thanks a bunch.

  16. Fantastic tips. These helped me create some commands to add to my ~/.bash_logout file to perform file/directory cleanup on logout. Cheers!

  17. #include

    int main()
    execl(“/bin/rm”, “rm”, “-f”, “/home/cc/rr* “, (char*)0);
    return 0;

    In the above program, I want to delete all file /home/cc/rr*. With above program it is not working, I mean it is not deleting. Please help.

  18. this culls directories older than 10 days:

    find /somePath -type d -name ‘someNamePrefix*’ -mtime +10 -print | xargs rm -rf ;

  19. -delete will also work in a directory with say… hundreds of thousands of files, -exec rm -rf will crash.

    1. I have never seen the exec rm -rf crash and I run it to scan over 150,000 files throughout the entire OS.

  20. For instance

    /bin/rm: Argument list too long
    -bash-3.2$ ls -l | wc -l
    -bash-3.2$ find . -delete

  21. i tried to use the command to find and delete files

    find . -name “find name” -exec rm {}\

    but the return message is missing argument to ‘-exec’

    what have I done wrong?

  22. How can check and redirect to a single file with the file names that contains the certain string of text? For example:

    If my files abc.txt, aaa.txt and bbb.txt where both aaa and bbb contains ERROR, and abc not. I need to point out the names aaa.txt and bbb.txt to another file ccc.txt…

    Just to name a few, but there might be others. I need a bash script to do this.
    Am searching for a solution from a week…:(

    1. Sorry for the late reply. I only nw saw this and also saw there was no response for this.

      grep -lir "Text to search" / (will search all files in all filesystems and report the filenames).

      Output that to an external file as you desire.

      grep -lir "Text to search" / >> myfile_list_to_delete.log
      grep -lir "Text to search" /home >> myfile_list_to_delete.log

      The above will find only in the /home folder.

  23. is there supposed to be a space before -exec in the example?
    find . -type f -name “FILE-TO-FIND” -exec rm -f {} \;

  24. Hi All,

    I want to find and delete some files from a single directory only, i mean i dnt want the find command to search any other sub directories how do i do tht???

  25. Hi,

    Can someone explain me strange behavior of deleting folder via find -exec.
    So I have folder ‘test’.
    When I’m executing such command:

    find ‘/Volumes/Storage/Dropbox/Backups’ -type d -name ‘test’ -exec rm -rf {} \;

    It says: find: /Volumes/Storage/Dropbox/Backups/test: No such file or directory

    BUT deletes it successfully.

    Why does it happen? What am I doing wrong? I need to avoid this error message because it causes exception in my script.

  26. try
    “\\; ” instead of “\; “. double backslash is actually represent one backslash in a C-like ASCII string
    do shell script “find /data2 -type f -name “*.bak” -exec rm -f {} \\; ”

    Test September 12, 2007 at 12:37 am

    Why does it require a backslash to terminate with the ;? I need to place this in an applescript under “do shell script” but it hates that backslash. Is there any way around it?

  27. Captain Mac June 26, 2012 at 11:28 pm
    “\\; ” instead of “\; “. double backslash is actually represent one backslash in a C-like ASCII string
    do shell script “find /data2 -type f -name “*.bak” -exec rm -f {} \\; ”

    Double slashes produces incorrect syntax for bash saying:
    “find: -exec: no terminating “;” or “+””

    For applescript it’s requires escaping one slash with double but it doesn’t help and produces the error above.

    Still don’t have solution :(

  28. Can you write exact of your applescript to the site? Since It worked on my mac to clean Picasa Originals directories…

    Other option remove single quotes and if necessary “;” from your script.

    Worst case scenario, try exception handling on the script without any action, if it works OK but throws exceptions only.

  29. Here is my applescript:

    on run {input, parameters}
    do shell script “find /Users/moleksyuk/Temp -type d -name ‘test’ -exec rm -rf {} \\;”
    return input
    end run

    Script with one slash:

    do shell script “find /Users/moleksyuk/Temp -type d -name ‘test’ -exec rm -rf {} \;”

    Or without semicolon

    do shell script “find /Users/moleksyuk/Temp -type d -name ‘test’ -exec rm -rf {} \\”

    are not valid for Automator.


  30. Here is my applescript:

    on run {input, parameters}
    do shell script “find /Users/moleksyuk/Temp -type d -name ‘test’ -exec rm -rf {} \\;”
    return input
    end run

    Other combinations (with one slash or without semicolon) are not valid for Automator.

    Error screenshot here –

  31. Hi i have a task to find the specific folder by name. I did that by using “find . -type d “example” ” now i have to find the folders of a specific user from the list of folder given by find command above.

    ex : if i have folder example-created by A, example-by B and example-by C
    then the above command will give

    now after this i just want to access or find the folders created by B user

    it should provide only example-byB user

    Can any one show some light on this and help me out


  32. Hi! I have a problem with this commands…. I try to find file and hen delete it however i cant =\
    with this command i get the right o/p but i cant make to delete this file:
    ls -aR /media/DATA/downloads/music | grep -iF “04 Edith Piaf – Platinum Collection [CD 1] – Mon Dieu”
    the idea is to delete file passing only one parameter without changing it -> name of file
    when i try this:
    rm `ls -aR /media/DATA/downloads/music | grep -iF “04 Edith Piaf – Platinum Collection [CD 1] – Mon Dieu”` i get errors where each part of string(file name) is separated. I tried with find to, any nothing, so i hope someone an help me ;)

  33. Very bad article !!!
    What means -type ???
    What means -name ???
    Just a command without any explanation!

  34. hi,

    im using find -f folder/* -mmin +120 -delete

    to delete all files within older than 2 hours and using cron to exec the script hourly, but its gets me an error mail all time when there is no file to delete.

    how can i check, that files exist to first?

    1. ok found it out myself:


      if [ “$(ls -A $DIR)” ]; then
      find /folder/path/* -mmin +120 -delete
      exit 0

  35. How do you log the output somewhere which files were successfully deleted or not in the find and delete command?

  36. To delete files that contain certain strings, just include a test of that as a condition of the find before you do the deletion. Let’s say you want to get rid of text files that have empty parentheticals, those (), [], and {} that you mention. Just have grep look for them. To make it interesting, I’ve added optional spaces within the empty grouping characters and made the deletion optional. To make it more interesting, you could also accept tabs as whitespace or use egrep and put all the tests in one regular expression.

    find this-dir that-dir -name \*.txt -exec grep -q -e ‘( *)’ -e ‘\[ *]’ -e ‘{ *}’ \{} \; -ok rm -f \{} \;

    So, this starts searching at this-dir and at that-dir looking inside there for files whose names end with .txt, and then it silently searches the file content for various kinds of parentheses wrapped around zero or more spaces. For each of those, it asks you whether to delete the file.

  37. Thanks for awesome example
    I would like to keep file last 3 month.
    The command below

    $ find . -mtime +90 -type f -exec rm -f {} \;

  38. If you use find with -depth, it will start the delete from the deepest folder first.
    So if I have ./temp, ./temp/temp1, and ./temp1/temp2

    find $HOME -depth ./temp -delete (or find $HOME -depth ./temp -exec rm -rf {} \; )
    will delete ./temp/temp1/temp2, then ./temp/temp1, and finally ./temp

  39. find /Volumes/CONVERT -type d -name “folder” -exec rm -rf {} \;
    Running the above command on my shared storage works, but produces an odd permission issue. I have mac and windows clients attached to the shared volume “CONVERT”. My windows machines will try to create a folder or file with the same name, but will claim they don’t have permission to do so, or they will say the folder/file already exists when it in fact it does not exist. I thought the mac was re-writing the permissions, but the permissions aren’t actually changing, the only problem is when the windows machines try to create a folder/file with the same name as the folder/file that was removed with the above command. Hope this makes sense, it’s kind of confusing. The folders/files that I’m trying to remove are temporary folders/files that are being automatically generated by software running on the mac and windows clients. I would like to remove all of them every now and again to free-up space on my server, however it will cause issues if my computers can’t re-generate these folders and files it will cause lots of errors and problems.

    Anybody else run into an issue like this?

  40. Can you happen to tell me how to add a file size limit to this.

    This works: find /home -name "error_log" -exec rm -rf {} \;

    I tried this but it does not work:

    find /home -size +5000000b -name "error_log" -exec rm -rf {} \;

    It doesn’t remove any files.


  41. not working:
    find / -name “*jpg.lck” -exec rm -rf {}\;
    find: missing argument to `-exec’

    what do i wrong?

  42. hi. sorry to disturb you.
    happy new year
    can you help me with my bash shell scripting?
    I have list.txt and each line inside it is a filename which sometimes contains special character and spaces. those files listed in list.txt is stored at /tmp/fordel directory. now my script is not working in deleting those files. Im using bash shell account.
    delfile.script below:

    cd $FOLDER
    sed -i '/^\s*$/d' $FOLDER/list.txt
    cat $FOLDER/list.txt | while read -r line
            cd $FOLDER
           find $FOLDER -iname "$line" -exec rm {} \;
    echo "Done"

    i need help pls what that find is not working or any other option?

    Still, have a question? Get help on our forum!