How to remove all the files in a directory?

  • I am trying to remove all files and subdirectories in a directory. I used rm -r to remove all files, but I want to remove all files and subdirectories, excluding the top directory itself.

    For example, I have a top directory like images. It contains the files header.png, footer.png and a subdirectory.

    Now I want to delete header.png, footer.png and the subdirectory, but not images.

    How can I do this in linux?

    cd into the directory and do an `rm -Rf` of all the files and directories in there.

  • If your top-level directory is called images, then run rm -r images/*. This uses the shell glob operator * to run rm -r on every file or directory within images.

    hidden file will not be deleted.

  • To delete hidden files, you have to specify:

    rm -r images/* images/.*
    

    With shells whose globs include . and .., this will lead to an error like

    rm: cannot remove `.' directory `images/.'
    rm: cannot remove `..' directory `images/..'
    

    but it will delete hidden files.

    An approach without errormessage is to use find/delete with mindepth. This is gnu-find.

    find images -mindepth 1 -delete
    

    Your find may lack the -mindepth or -delete predicate, in which case, you could do:

    find images/. ! -name . -prune -exec rm -rf {} +
    

    My suggestion was to use 'rm -r images/.*' which would match 'images/..' but not 'images/../..'. The recursion can't go upwards, since 'images/../images/..' is again the same directory.

    @DarkHeart `rm .*` doesn't delete `.` or `..` and hasn't since at least 1994 for the GNU utils and likely since the late 70s for UNIX. It is extremely unlikely you'll find a system where `rm .*` traverses the filesystem upwards outside of a museum.

  • To delete all files and directories(including the hidden ones) in a directory, you can try the following:

    • use ls -Ab to match all files/directories

      cd dir_name && rm -rf `ls -Ab`
      
    • use find to match all files/directories

      find dir_name -mindepth 1 -delete
      

      or, if your find doesn't support -delete:

      find dir_name -mindepth 1 -exec rm -rf {}
      
    • delete the folder, then recreate it

      rm -rf dir_name && mkdir dir_name
      
    • in bash,

      shopt -s dotglob  
      rm -rf dir_name/*
      

    Note that command like `rm -rf *` is not safe if you have no knowledge of files in a directory, because a file starting with `-` (hyphen) will be interpreted as `rm` flag...

    EDIT: to do it safe, use `rm -rf ./* ./.*`

  • To delete all regular files recursively inside a directory, this command (assuming GNU or FreeBSD find) is good enough:

    find . -type f -delete
    

    That leaves all the non-regular files like symlinks (whether they point to regular files or not), directories, fifos, sockets, devices...

    See also:

    find . ! -type d -delete
    

    to delete files of any type except directory.

  • Try this version:

     rm -r test/*
    

    This won't remove hidden files (ones starting with ".").

  • I am using find command here:

    Step 1: Find all the files and delete them :

    find /path/to/directory/ -type f -exec rm {} \;
    

    Example:

    find /home/user/Desktop/images/ -type f -exec rm {} \;
    

    Step 2: Find all the sub-directories and delete them :

    find /path/to/directory/ -type d -exec rm -R {} \;
    

    `find /path/to/directory/ -type d` includes `.` so will delete the directory itself. You need to also use the `-mindepth` switch as others have said.

  • The question was to empty a directory = remove contents of a directory including hidden files, but not the directory itself. The find command with -mindepth 1 is actually the correct way to go, but to avoid error messages it must be joined with -maxdepth 1:

    find /path/to/dir -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \;
    
  • This works perfectly for me, tested several variations worked every time.

    From the directory that holds the images directory.

    rm -frd ./images/*
    

    before:

    images/
        |_ header.png
        |_ footer.png
        |_ subdir/
    

    after:

    images/
    

    Not sure it was made clear in the original question, but just to point out that unless you enable dotglob, this will skip any "dot-file" or dot-directory under images (`mkdir images/.somedir`; `touch images/.somefile`)

  • To delete all files and subdirectories in the current directory, including hidden ones, without error message:

    rm -rf .[^.] .??* *
    

    Or, from the parent directory:

    rm -rf images/.[^.] images/.??* images/*
    

    From https://serverfault.com/a/47940/269538.

  • Another option:

    $ rm -rf /path/to/directory/{*,.*}
    

    source: https://askubuntu.com/a/552834/56648

License under CC-BY-SA with attribution


Content dated before 6/26/2020 9:53 AM