Linux File Management: cp, mv, rm, touch, ln, stat, and rsync
Managing files and directories is the cornerstone of operating a Linux system. This guide covers file lifecycle management: copying, moving, deleting safely, creating, manipulating links, inspecting filesystem inodes with stat, and synchronizing files with rsync.
⚡ Quick Dive
File Operations Cheat Sheet
| Command | Action | Example |
|---|---|---|
cp -a <src> <dest> |
Archive copy (preserves permissions, ownership, timestamps, symlinks) | cp -a /var/www /backup/ |
cp -u <src> <dest> |
Update copy (copy only when source is newer) | cp -u report.txt backup/ |
mv <src> <dest> |
Move or rename file/directory atomically | mv old_name.txt new_name.txt |
rm -I <files> |
Prompt once before removing more than 3 files | rm -I *.log |
rm -rf <dir> |
Forcefully & recursively delete directory tree | rm -rf /tmp/build_cache |
touch <file> |
Create empty file or update access/modification timestamps | touch server.pid |
ln -s <target> <link> |
Create symbolic (soft) link | ln -s /etc/nginx/sites-available/app /etc/nginx/sites-enabled/ |
ln <target> <link> |
Create hard link (shares same inode) | ln original.txt hardlink.txt |
stat <file> |
View detailed file metadata, timestamps, and inode information | stat database.sqlite |
rsync -avz <src> <dest> |
Fast incremental sync preserving attributes | rsync -avz ./src/ user@remote:/app/ |
Quick Start Examples
# Safely duplicate a production configuration preserving all permissions
cp -a /etc/nginx /etc/nginx.bak
# Create a symbolic link for an active configuration
ln -s /opt/app/v2.1.0 /opt/app/current
# Inspect detailed timestamps (access, modify, change, birth) and inode
stat /etc/hosts
📖 Extended Guide
1. cp — Copy Files & Directories
The cp command duplicates files and directories across the filesystem.
Syntax
cp [OPTIONS] <SOURCE...> <DESTINATION>
Essential Options
-r,-R(--recursive): Copy directories and their contents recursively.-a(--archive): Recommended for sysadmins. Same as-dR --preserve=all(preserves file mode, ownership, timestamps, symlinks, and ACLs).-p(--preserve): Preserves specified attributes (mode,ownership,timestamps).-u(--update): Copy only if source is newer than destination or destination is missing.-i(--interactive): Prompt before overwriting existing files.-v(--verbose): Show files being copied.--backup[=CONTROL]: Make a backup of each existing destination file before overwriting.
Examples
# 1. Full directory mirror copy
cp -av /etc/prometheus /mnt/backups/prometheus
# 2. Update directory with newer changes only
cp -ru ./dev_assets/ ./production_assets/
# 3. Create automatic backup suffix on overwrite
cp --backup=numbered config.env config.env.bak
2. mv — Move & Rename Files
The mv command renames files/directories or moves them across directory trees.
Syntax
mv [OPTIONS] <SOURCE...> <DESTINATION>
Mechanics & Behavior
- Same Filesystem: Renaming or moving within the same filesystem is an atomic pointer update in the directory entry; file contents are not read or rewritten.
- Cross Filesystem: If moving between partitions/mounts,
mvautomatically copies the data and then removes the source.
Useful Options
-i: Prompt before overwriting an existing file.-n(--no-clobber): Never overwrite an existing file.-u(--update): Move only if source file is newer than target.-v: Verbose output displaying moves.
# Rename file
mv server.conf.old server.conf
# Move multiple files into a directory
mv *.log /var/log/archive/
3. rm — Remove Files & Directories
The rm command unlinks and removes files or directory trees from the filesystem.
Syntax
rm [OPTIONS] <TARGET...>
Essential Options & Safety Guards
-r,-R(--recursive): Recursively remove directories and their contents.-f(--force): Ignore nonexistent files and never prompt before removing.-i: Prompt before every single removal.-I: Prompt once before removing more than 3 files, or when removing recursively (much less intrusive than-i).--preserve-root: Prevents accidental deletion of/(enabled by default in modern GNUrm).
[!CAUTION] Safety Guardrails for
rm -rf:
- Avoid variables without quotes:
rm -rf "$DIR/*"instead ofrm -rf $DIR/*(an unset$DIRcould becomerm -rf /*).- Prefer
trash-cli(trash-put) in interactive desktop environments for a recoverable trash bin.- Use
lswith your wildcard first before runningrmon matching files.
4. touch — Create Empty Files & Manage Timestamps
The touch command creates empty files or modifies file timestamps without altering file contents.
Understanding Linux Timestamps
- Access Time (
atime): Last time the file was read. - Modification Time (
mtime): Last time file contents were modified. - Change Time (
ctime): Last time file metadata/inode (permissions, ownership) changed.
Examples
# Create empty files
touch main.py README.md
# Set specific modification/access date (YYYYMMDDhhmm.ss)
touch -t 202601011200.00 release_notes.txt
# Sync timestamp of fileA to match fileB
touch -r reference_file.txt target_file.txt
# Update access time only (-a) or modification time only (-m)
touch -a existing_file.txt
5. ln — Hard Links vs. Symbolic Links
Linux supports two types of links to reference files:
HARD LINK: SYMBOLIC (SOFT) LINK:
Directory Entry A ──┐ Symlink Entry ──> Path "/data/file.txt" ──> Inode 42 ──> Storage
├──> Inode 42 ──> Storage
Directory Entry B ──┘
Comparison Matrix
| Feature | Hard Link (ln target link) |
Symbolic Link (ln -s target link) |
|---|---|---|
| Inode Number | Shares identical inode with original | Gets its own unique inode |
| Cross-Filesystem | ❌ No (restricted to single filesystem) | ✅ Yes (can link across mounts/disks) |
| Directories | ❌ No (prevents filesystem cycles) | ✅ Yes (can link to directories) |
| Original File Deleted | Content remains accessible via link | Link breaks ("dangling/broken symlink") |
| File Permissions | Mirrors original file permissions | Always rwxrwxrwx (target permissions apply) |
Practical Linking Commands
# 1. Create symbolic link to a file or directory
ln -s /etc/nginx/sites-available/mysite.com /etc/nginx/sites-enabled/
# 2. Create hard link
ln /data/reports/january.csv /data/backups/january_hardlink.csv
# 3. Force overwrite an existing link
ln -sf /opt/app/v2.0 /opt/app/active
# 4. Remove a link (does NOT delete original target)
unlink /opt/app/active
# OR
rm /opt/app/active
6. stat and file — Inspecting File Metadata
stat: Inode & Block Inspection
$ stat /etc/passwd
File: /etc/passwd
Size: 2842 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 131102 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2026-08-29 10:15:32.000000000 +0200
Modify: 2026-08-28 14:02:11.000000000 +0200
Change: 2026-08-28 14:02:11.000000000 +0200
Birth: 2026-01-10 08:00:00.000000000 +0200
file: Identifying Real File Types
The file command reads magic bytes in headers to determine file type, independent of file extension:
$ file document.pdf
document.pdf: PDF document, version 1.7
$ file archive.tar.gz
archive.tar.gz: gzip compressed data, from Unix, original size modulo 2^32 10485760
7. Introduction to rsync for File Synchronization
For large directory synchronization, backups, and network transfers, rsync is vastly superior to cp:
# Sync local directory to backup directory (trailing slash copies contents)
rsync -avh --progress /var/www/html/ /mnt/backup/html/
# Perform dry run before executing destructive operations
rsync -avh --dry-run --delete /source/ /destination/