- How to remove all files and subdirectories in a directory WITHOUT deleting the directory in bash?
- 12 Answers 12
- Remove Directory Recursively without Prompting for Confirmation in Linux
- Step 1: List Contents of Directories
- Step 2: Remove a Single Directory Recursively without Prompting the User for Confirmation
- Step 3: Remove Multiple Directories Recursively without Prompting the User for Confirmation
- Step 4: Verify Deletion of Specified Directories
- Conclusion
- About the author
- Aqsa Yasin
How to remove all files and subdirectories in a directory WITHOUT deleting the directory in bash?
Is there a command to remove all files and subdirectories in a directory without deleting the directory? For example if I have directory dontDeleteMe with subdirectories 1 , 2 , 3 and each subdirectory has a few pictures in it, how can I remove the subdirectories 1 , 2 , and 3 and all the files in the them, without removing the parent directory dontDeleteMe ?
12 Answers 12
To remove everything in a directory without removing the directory, type in:
Please note, the /* part is very important. If you put a space before the * , it will delete all your files in your current directory.
Also, be very careful playing with rm , -r and * all in the same command. They can be a disastrous combination.
Update: Okay, I realized if you do have hidden/dot files [filenames with dots at the beginning, e.x. .hidden ] then this will leave those files intact.
So really, the simplest solution to the original question is:
rm -rfv dontDeleteMe && mkdir dontDeleteMe
Another one would be to use find ‘s -exec option or pipe to xargs (below):
find dontDeleteMe/* -print0 | xargs -0 rm -rv
@justingrif: find dontDeleteMe/* -print0 | xargs -0 rm -rv I believe in most cases this will work, regardless of spaces, and what not. But cd to /tmp/ and make a test directory and try it out. 🙂
Re-making a directory does not equal deleting its contents. e.g. umask directory permission differences, owner differences, etc. enzotib’s answer would solve the issues with your original syntax
This is not a good answer. Using * is dangerous, and won’t work on dotfiles without «dotglob» (see below). rm -rf dontDeleteMe && mkdir dontDeleteMe doesn’t ensure that the dir is re-created with the same permissions/owner(s). Instead, use one of the find dontDeleteMe/ -mindepth 1 -delete variants below.
@NilsToedtmann, with all due respect, I did give fair warning in my answer that the * should be used with care.
Open terminal ( Ctrl + Alt + T ) ant type this:
find somedir -mindepth 1 -delete
This will match all files and directories within somedir and its (grand-)children including «hidden» dot files but excluding somedir itself because of -mindepth 1 , then -delete them.
@EricP The main difference between find with -mindepth 1 and rm is that the former will keep the directory and only delete its contents. It’s not safer per se, both will delete everything in the directory without confirmation if you have the permissions to do so. But find is more flexible (it has many more options than rm ).
The only reason rm -r ./* do not always work is because you can have hidden files and/or folder that are not matched by * .
To this end, bash provide an option to make * match everything, even hidden objects:
cd dont-delete-me shopt -s dotglob rm -r ./*
It can be useful to reset dotglob to its default (unset) state, if you keep on using the shell where you executed the above commands:
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf <> \;
Use xdev option to delete files only within device boundary.
To delete (in terminal) all files and subdirectories except for the base directory named «dontdelete»:
You can use find with the -delete flag:
The /* is important as it tells find to search only INSIDE the folder called «dontDeleteMe».
Also ensure that the -delete flag is at the end of the find command.
This solution doesn’t delete any hidden files, unless you enable dotglob . Otherwise, using the -mindepth 1 flag option seems the only way to get it working.
Remove all files starting with . in «directory» and all other files too.
Though as kindly noted by Neftas this solution is not safe!
This command could potentially be dangerous, since you’re also including . and .. directories. This may be avoided by changing <.*>to <. *>, but then you won’t delete hidden files with only one character, such as .a .
There is an even simpler answer:
Basic system administration lecture time: Be sure to pay attention to where you are when you use sweeping commands like this.
I can’t say that enough. I’ve had to recover a box because someone wasn’t paying attention and typed in rm -rf * while in /.
*nix assumes that if you are root or if you are sudo-ing as root that you know what you are doing. So make sure that you know what you’re doing before you do it.
An alternative which makes sure your ‘cd’ command works before you issue the ‘rm’ is to use
Actually it’s not any more or any less dangerous than what you suggest. All the && does is to chain the two commands together so that they execute at the same time. If anything my method is actually SAFER since you have to stop and .look before you execute the rm -rf *. Pausing to double check is always better.
@user30619 The && operator doesn’t just chain the commands together; it requires that each command be successful before the next one will be executed. If the cd command fails for any reason (directory doesn’t exist, privileges, etc) then the rm command won’t be executed. I’d call that safer.
I am not sure why this is so complex, help me if i am wrong
This has the slight flaw of trying to delete the current directory as well, which, of course, doesn’t work, because it’s still in use as the working directory of the invoking shell.
One can delete the current directory from inside it—and then be «in» a nonexistent directory. rmdir ../tmp , from an empty directory called tmp , will do that. The technique in this answer doesn’t delete the current directory because the rm command special-cases the specific pathnames . and .. , refusing to operate on them. Thus rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’ (from GNU rm, which provides /bin/rm in Ubuntu) is quite literally what is happening. rmdir . behaves similarly, though it shows a less illuminating Invalid argument error. @DavidFoerster
- Easiest thing for me — a windows expert but an ubuntu newbie
- Click the Files icon on the launcher
- Navigate to the directory where the files and folders are located that you want to delete
- Right Click in a blank area of the window next to the files and click «Open in Terminal» — leave the Files window open
- A terminal window will open and will be «set» to the folder you located
- You can type «dir» (disregard quotes when i say type) and press enter for the terminal to show a list of files and folders — just to prove you are «in» the right folder
- type «rm -rf *» and press enter
- depending on size of folders/files to delete system will pause
- When terminal prompt returns, the Files window you had opened will now say «Folder is Empty»
- I had success with this method and it gave me comfort to see the files/folder both in the Files window and as a result of the Dir command in the terminal window
- I was also comforted that the Files window displayed the folder now empty — especially since I had been chasing these files around looking for the trash folder that they were in
- Thanks to everyone else who submitted answers — it was very informative
Remove Directory Recursively without Prompting for Confirmation in Linux
At times, you may have more than one directory within a single directory. This is known as a subdirectory, defined as a directory within a directory. Usually, the subdirectories within a directory are closely related to that directory. This means that whenever you feel like you do not need a particular directory anymore, then you also will not need its subdirectories further. So, the question arises, “How do I get rid of all the files and directories within a directory?”
This is where the concept of recursive deletion comes into play. Recursive deletion aims to delete all the files and directories within a subdirectory. Generally, whenever you attempt to delete any file or a directory within any operating system, the OS prompts you to provide confirmation to prevent accidental deletion of important files or directories. However, if you are 100% sure of what you are going to delete, and there is a large number of files to be deleted, then you might find it troublesome to provide confirmation for every file or directory.
In this case, you can remove a directory recursively without being prompted by the OS for confirmation every time. This article explains how to remove a directory recursively without prompting the user for confirmation in Linux Mint 20.
To remove a directory recursively in Linux Mint 20 without prompting the user for confirmation, the following series of steps should be performed.
Step 1: List Contents of Directories
We have created two sample directories, namely, Directory1 and Directory2, in our Home directory to demonstrate this method of removing directories recursively in Linux Mint 20. Directory1 contains two subdirectories, named D1 and D2, whereas Directory2 contains the file named D5. We will show you the contents of our Home directory so that you can verify that Directory1 and Directory2 exist in our Home directory. To list the contents of the Home directory, we will run the following command in our terminal:
You can see from the output of this command that Directory1 and Directory2 exist in our Home directory, as highlighted in the image below. We performed this step so that you can easily verify the deletion performed in Step 4 of this method.
Next, we will show you the contents of our Directory1 by running the following command in the terminal:
Here, you can give the path of any directory of which the contents you would like listed.
The contents of Directory1 are shown in the image below:
Finally, we will show you the contents of our Directory2 by running the following command in the terminal:
Here, you can give the path of any directory of which the contents you would like listed.
The contents of Directory2 are shown in the image below:
Step 2: Remove a Single Directory Recursively without Prompting the User for Confirmation
To remove a single directory recursively without prompting the user for confirmation, run the following command in your terminal:
Here, replace “PathOfTheDirectoryToBeDeleted” with the exact path of the directory that you intend to delete. In our case, the directory is /home/aqsa_yasin/Directory1. The “-rf” flag, along with the “rm” command, removes a directory recursively without prompting the user for confirmation.
Step 3: Remove Multiple Directories Recursively without Prompting the User for Confirmation
If you wish to remove multiple directories recursively at a time without prompting the user for confirmation, then skip Step 2 and, instead, run the following command in your terminal:
Here, replace “Path1” and “Path2” with the exact paths of the directories that you intend to delete. In our case, we only wanted to delete two directories, i.e., Directory1 and Directory2. However, you can remove as many directories as you want using this command simply by stating the paths of the directories, separated by spaces, following the “rm –rf” command.
Step 4: Verify Deletion of Specified Directories
After executing the command in Step 3, ideally, our Directory1 and Directory2 should be removed, along with all their subdirectories, from our Home directory. We can always confirm whether the deletion process has successfully taken place by listing down the contents of our Home directory. We can do so by running the following command in the terminal:
This time, in the output of this command, we will no longer be able to see Directory1 and Directory2 in the Home directory, as shown in the image below. This indicates that the specified directories have been removed successfully.
Conclusion
By using the method prescribed in this article, you can remove a single directory or multiple directories recursively without prompting the user for confirmation in Linux Mint 20. With this method, you can get rid of all the traces of a directory at once, including all the subdirectories and files within it, without constantly needing the user to provide consent. In this way, you can easily and quickly free up your system’s storage space for more important files and directories. I hope that, by following this article, you are now in the position to delete directories recursively without prompting the user for confirmation.
About the author
Aqsa Yasin
I am a self-motivated information technology professional with a passion for writing. I am a technical writer and love to write for all Linux flavors and Windows.