Remove all files in a directory (do not touch any folders or anything within them)
Categories:
Efficiently Remove Only Files in a Directory (Linux/Bash)

Learn how to safely delete all files within a specified directory without affecting any subdirectories or their contents, using various command-line tools in Linux and Bash.
When managing files on a Linux system, a common task is to clean up a directory by removing its direct file contents, while leaving subdirectories and their files completely untouched. This article explores several robust and safe methods to achieve this, focusing on common command-line utilities like rm
, find
, and globbing patterns. We'll cover different scenarios and best practices to ensure you only delete what you intend to.
Understanding the Challenge: Files vs. Directories
The primary challenge lies in distinguishing between files and directories. A simple rm *
command would attempt to remove everything, including directories, which is often not the desired behavior. We need a way to filter our deletion command to specifically target regular files. This is crucial for maintaining directory structures that might contain important sub-projects, configurations, or data within their subfolders.
flowchart TD A[Start] --> B{Target Directory?} B -->|Yes| C{Identify Contents} C --> D{Is it a File?} D -->|Yes| E[Delete File] D -->|No| F{Is it a Directory?} F -->|Yes| G[Skip Directory] F -->|No| H[Skip Other Type] E --> I[Next Item] G --> I H --> I I --> J{More Contents?} J -->|Yes| C J -->|No| K[End]
Decision flow for selectively deleting files in a directory.
Method 1: Using rm
with Globbing Patterns
The simplest approach for many scenarios is to use the rm
command combined with shell globbing patterns. The *
wildcard matches all files and directories, but we can refine this. The key is to ensure that your shell's globbing behavior doesn't expand to directories when you only want files. In most modern shells (like Bash), rm *
will try to remove directories, which will fail unless -r
is used. However, we can use specific patterns or options to prevent this.
shopt -s extglob # Enable extended globbing (if not already enabled)
rm -v -- * # Delete all files and empty directories (will prompt for non-empty directories)
# A safer approach for only files:
rm -v -- *.* # Deletes files with at least one dot in their name
rm -v -- *[^/] # Deletes files and symlinks, but not directories (requires careful testing)
Using rm
with globbing patterns. Be cautious with *[^/]
as it might not be universally safe.
rm *
without -r
will attempt to remove directories and fail with an error, but it will still delete regular files. Always be careful with rm
and consider using rm -i
for interactive confirmation or rm -v
for verbose output.Method 2: Using find
for Precise Control
The find
command offers the most robust and precise way to locate and act upon files based on various criteria, including file type. This is generally the recommended method for complex or critical operations, as it allows you to specify exactly what you want to delete. The -maxdepth 1
option is crucial here, as it restricts find
to only search the current directory and not descend into subdirectories.
# Navigate to the target directory first (recommended)
cd /path/to/your/directory
# Find and list only files in the current directory
find . -maxdepth 1 -type f
# Find and delete only files in the current directory
find . -maxdepth 1 -type f -delete
# Alternatively, using -exec rm:
find . -maxdepth 1 -type f -exec rm -v {} +
Using find
to precisely target and delete only files in the current directory.
find . -maxdepth 1 -type f
first without the -delete
or -exec rm
part to preview which files will be affected. This is a critical safety step before executing any deletion command.Method 3: Iterating with a for
Loop (Bash)
For more advanced scenarios or when you need to perform additional operations on each file before deletion, a for
loop in Bash provides flexibility. This method allows you to check each item individually and apply conditions before executing rm
. This is particularly useful if you need to exclude certain files based on more complex patterns than find
or globbing can easily handle.
cd /path/to/your/directory
for item in *; do
if [ -f "$item" ]; then
echo "Deleting file: $item"
rm "$item"
fi
done
Using a for
loop to iterate and delete only files, with a safety check.
[ -f "$item" ]
condition checks if $item
is a regular file. This ensures that directories, symlinks, and other file types are ignored, making this a very safe method.1. Choose Your Method
Evaluate the complexity of your task. For simple cases, rm
with careful globbing might suffice. For precision and safety, find
is usually best. For custom logic, a for
loop is ideal.
2. Navigate to the Directory
Always cd
into the target directory before running deletion commands. This reduces the risk of accidentally deleting files in the wrong location.
3. Preview Changes (Crucial!)
Before executing any rm
command, use ls
, find . -maxdepth 1 -type f
, or echo
within your loop to see exactly which files will be affected. This is your last line of defense against accidental data loss.
4. Execute the Deletion
Once you are confident in your command, execute it. Consider adding -v
(verbose) to rm
for confirmation of deleted files.