Terminal How to Delete a Directory (Linux/macOS)
Problem
- You need to delete a directory from the terminal.
- You want safe options, not just
rm -rf
, and to understand the flags. - Works on Linux and macOS (POSIX shells).
Solutions
Use the Linux/POSIX rm
and rmdir
commands to delete files and directories.
Delete an empty directory:
rmdir path/to/dir
# or with rm (GNU/BSD): removes empty dirs only
rm -d path/to/dir
Delete a directory and all contents (recursive):
rm -r path/to/dir
# -r : recursive; descends into subdirectories
Delete recursively without prompts (use with care):
rm -rf path/to/dir
# -r : recursive
# -f : force (ignore missing files, never prompt)
Delete recursively but safer prompting:
rm -rI path/to/dir
# -I : prompt once if removing more than three files; safer than -i (which prompts every file)
Delete a directory by sending it to Trash/Recycle (safer, recoverable):
# Linux (GNOME/FreeDesktop)
gio trash path/to/dir
# Many distros (after installing trash-cli)
trash-put path/to/dir
trash-put
is part of the trash-cli package. It is user-friendly for those familiar with command-line interfaces and integrates well with various desktop environments.
What gio
does
- Instead of permanently deleting a directory with
rm
, this command moves it to the desktop Trash/Recycle Bin. - That means you can recover it later from your GUI’s Trash folder.
- It’s a safety-net alternative to
rm -rf
, useful if you want to avoid “oops I deleted the wrong thing permanently.”
Why two versions?
-
gio trash
- Part of the GIO / GLib utilities (ships with GNOME desktop and many Linux distros).
- Standard command to send files to the FreeDesktop Trash location (
~/.local/share/Trash
).
-
trash-put
- Part of the trash-cli package (can be installed on most Linux distros, and also via Homebrew on macOS).
- Provides a more portable interface to the same idea: moving files to Trash.
Use find
to Delete or Empty Directories
Delete with find (useful for patterns, empty dirs, or guarding boundaries):
# remove only empty directories under logs/
find logs -type d -empty -delete
# remove a specific named directory anywhere under build-root/
find build-root -type d -name "tmp" -exec rm -r {} +
Things to Consider
- Commands are the same on Linux and macOS, and on most POSIX-compliant systems.
- “Folders” are called directories in POSIX terminology.
- You may need privileges. Use
sudo
only when required.
On POSIX systems (Linux, macOS), commands like rm
treat arguments that start with a dash/hyphen -
as options (flags).
For example:
rm -r -weirdname
rm
thinks-weirdname
is another flag (an invalid one) instead of a path. You’ll get an error like “invalid option — w”.- Spaces and globbing matter. Quote paths:
rm -r "My Project/old build"
If permissions block deletion, add write permission (u+w
) first:
chmod -R u+w path/to/dir && rm -r path/to/dir
How to Delete Files Starting with -
Two common approaches:
--
end of options marker
rm -r -- -weirdname
The --
tells rm
“no more options after this,” so everything that follows is treated as a filename.
- Prefix with
./
(relative path)
rm -r ./-weirdname
Here, ./-weirdname
clearly points to “a file in the current directory named -weirdname
,” not an option.
Overview of -rf
The combination -rf
is commonly used with the rm
command to remove directories and their contents without any confirmation prompts or error stops. Individually:
-r
enables recursive removal.-f
forces the action by silencing warnings and errors.
Option | Stands For | Effect |
---|---|---|
-r | recursive | Descends into directories, removing all files and subdirectories inside the target. |
-f | force | Suppresses most warnings and error messages; ignores nonexistent files and overrides write-protected files without prompt. |
Gotchas
rm -rf /
or a wrong path can wipe critical data. Double-check withpwd
andls
.rmdir
only removes empty dirs; it fails if files remain.rm -f
hides errors (including typos) and skips prompts—dangerous by default.- On macOS,
trash
is not built-in; install (brew install trash
) or usegio
if available. - Mounted or read-only filesystems won’t delete; check with
mount
ordf -h
. - Immutable files (Linux
chattr +i
) won’t delete until cleared:sudo chattr -R -i path
. sudo rm -rf
runs as root and bypasses permission checks. A typo or wrong path here can wipe the entire system. Avoid unless absolutely required, and always double-check the path withls
first.
Sources
- GNU Coreutils: rm
- GNU Coreutils: rmdir
- GNU Findutils: -delete
- BSD rm(1) manual (macOS-alike)
- trash-cli (FreeDesktop trash)
Further Investigation
- Learn pattern-safe deletion with
find
,-maxdepth
, and-mindepth
. - Explore shell safeguards: aliases like
rm='rm -I'
andset -o noclobber
. - GNU Coreutils Manual
TL;DR
Empty a directory (delete all files in a folder):
rmdir path/to/dir
Recursive (safer prompt):
rm -rI path/to/dir
Force everything (be sure):
rm -rf path/to/dir
Recoverable delete:
gio trash path/to/dir
Or use trash-put
:
trash-put path/to/dir