Everything in Linux is a file. Your documents are files, your programs are files, your terminal is a file, even your hardware devices are represented as files. This single idea is what makes Linux so powerful and consistent — but it also means that if you want to be productive on the command line, you must learn to manage files and directories fluently.
In this guide, we'll cover the essential commands and concepts: navigating the filesystem, creating, copying, moving, and deleting files, understanding the directory structure, finding files fast, and — critically — how to avoid the mistakes that destroy data.
The Linux Directory Structure: Start Here
Before touching any command, you need a map. Unlike Windows with its C:\ drive, Linux has one single tree that starts at the root directory, written as /.
ls / bin dev home lib32 media opt root sbin srv tmp var boot etc lib lib64 mnt proc run snap sys usr The important ones to know:
| Directory | What lives here |
|---|---|
/home | Personal folders of normal users (/home/yeasin) |
/root | Home directory of the root user |
/etc | System-wide configuration files |
/var | Variable data: logs (/var/log), caches, websites |
/tmp | Temporary files — often cleared on reboot |
/usr | Installed programs and their files |
/opt | Third-party / manually installed software |
/dev | Device files (disks, terminals appear here) |
/proc | Virtual files exposing kernel and process info |
Note: Unlike Windows, Linux uses
/(forward slash) as the separator, and paths are case-sensitive./home/Yeasinand/home/yeasinare two different paths.
Absolute vs relative paths
There are two ways to write a path:
- Absolute path — starts from
/:/home/yeasin/projects/app.js(works from anywhere) - Relative path — starts from your current location:
projects/app.js
Two special names help you move around:
-
.— the current directory -
..— the parent directory (one level up)
So cd .. moves up, and cd ../.. moves up two levels.
Navigating: pwd, ls, and cd
Always know where you are before you act. Three commands handle all navigation:
Where am I? — pwd
pwd /home/yeasin pwd (print working directory) shows your current location in the tree. It sounds trivial, but in long terminal sessions with multiple tabs, it saves you from running commands in the wrong place.
What's here? — ls
ls # list names only ls -l # long format: permissions, owner, size, date ls -a # include hidden files (starting with .) ls -la # long + hidden, the everyday combo ls -lh # long + human-readable sizes (K, M, G) ls -lt # sorted by modification time, newest first Example output:
total 24K drwxr-xr-x 3 yeasin yeasin 4.0K Oct 17 12:00 projects -rw-r--r-- 1 yeasin yeasin 2.2K Oct 16 18:42 notes.txt drwxr-xr-x 2 yeasin yeasin 4.0K Oct 15 09:10 .ssh Two useful extras: ls -R lists directories recursively, and ls /etc lists a directory without entering it.
Moving around — cd
cd /var/log # go to an absolute path cd projects # go into a subdirectory (relative) cd .. # go up one level cd ~ # go to your home directory cd - # go back to the previous directory cd # no argument = home directory too cd - is a small trick worth remembering: it toggles between your last two locations, like a channel-swap button.
Creating Files and Directories
Touch — create an empty file
touch notes.txt touch a.txt b.txt c.txt touch also has a second job: it updates the timestamp of an existing file without changing its content.
mkdir — create directories
mkdir projects mkdir projects/src projects/docs # multiple at once mkdir -p projects/src/components # create parents as needed The -p flag is the one to remember. Without it, creating projects/src/components fails if projects doesn't exist yet. With -p, the whole chain is created in one shot.
Creating files with content
For a quick file with text, you don't even need an editor:
echo "Hello, world" > hello.txt # overwrite echo "Second line" >> hello.txt # append Copying and Moving
cp — copy
cp notes.txt backup.txt # copy a file cp -r projects projects-backup # copy a directory (recursive required) cp -i notes.txt old.txt # ask before overwriting cp *.txt /tmp/ # copy all .txt files somewhere Warning:
cpoverwrites existing files silently by default. Ifold.txtalready exists, it's gone with no confirmation. Use-i(interactive) whenever you're unsure. A safer habit for a session:alias cp='cp -i'.
Note that cp for a directory requires -r — without it, cp refuses to copy directories. This is a safety feature, not a limitation.
mv — move and rename
mv is two commands in one — it moves files and it renames them (renaming is moving to a new name):
mv notes.txt documents/ # move into a directory mv notes.txt todo.txt # rename mv -i old.txt documents/ # ask before overwriting mv projects/ archive/ # move a whole directory mv is fast even for huge files, because moving on the same filesystem doesn't copy data — it just updates the pointer.
Deleting: rm, rmdir, and Staying Safe
This is the part where mistakes hurt, so let's be careful and precise.
rm — delete files
rm notes.txt # delete one file — no recycle bin, no undo rm -i notes.txt # ask for confirmation first rm -r projects # delete a directory and everything inside rm -f stuck.txt # force: ignore warnings, don't ask Three facts every Linux user must internalize:
- There is no trash bin.
rmis permanent. -
rm -ris powerful enough to delete an entire system. That's whysudo rm -rf /is the most infamous command in Linux — it means "delete everything, don't ask, no exceptions." -
rmdoesn't ask for confirmation by default. A typo in a path can delete the wrong thing instantly.
rmdir — the cautious alternative
rmdir empty-folder rmdir only removes empty directories. If there's anything inside, it refuses. This makes it a great "safe" option when you expect a folder to be empty and want to be alerted if it's not.
Safer deletion patterns
A professional habit: list first, then delete.
ls projects/*.log # see exactly what will be deleted rm projects/*.log # now delete it Even better — use -i once and build the habit:
rm -ri old-projects/ Tip: One character in the wrong place makes
rmdangerous.rm -rf projects /(with a space before the slash) would deleteprojectsand the root filesystem. This is not a joke command — it's a real typo people have made. Always read the full command once before pressing Enter, especially withsudo.
Viewing Files
Before editing, you usually want to look inside a file:
cat notes.txt # print the whole file less notes.txt # open in a pager: q to quit, / to search head -n 20 notes.txt # first 20 lines tail -n 20 notes.txt # last 20 lines tail -f app.log # follow a log file live as it grows The distinction matters for real work:
-
catis fine for small files, but a 10,000-line log will flood your terminal. -
lesslets you scroll, search (/pattern), and quit withq. -
tail -fis how sysadmins watch logs in real time — every new line appears as it's written. Debugging a live service? This is your window.
Finding Files: find and locate
find — powerful, real-time search
find /var/log -name "*.log" # by name find ~ -type d -name projects # directories only find /etc -iname "*.conf" # case-insensitive find . -size +100M # files bigger than 100 MB find . -mtime -7 # modified in the last 7 days find . -name "*.tmp" -delete # find AND delete in one command find walks the actual filesystem, so it's always accurate — but can be slow on huge trees. The -delete action at the end is efficient, but treat it like rm: run the command without -delete first to preview the results.
locate — fast, database-based
sudo apt install plocate -y locate nginx.conf locate answers instantly because it searches a pre-built database (updated daily, or manually with sudo updatedb). The tradeoff: very new files may not be in the database yet.
Wildcards: The Pattern Language of the Shell
Wildcards (glob patterns) are how you select many files at once — and they work with every command:
| Pattern | Matches |
|---|---|
* | Any number of any characters |
? | Exactly one character |
[abc] | One character: a, b, or c |
*.txt | All files ending in .txt |
file?.log | file1.log, fileA.log — but not file10.log |
Real examples:
cp *.jpg /backup/ rm old-*.tmp mv report?.pdf reports/ Note: The shell expands the wildcard before the command runs — the command never sees the
*, only the expanded list. This is why listing withlsfirst is a reliable preview of what a glob will touch.
A Practical Workflow: Organizing a Messy Folder
Let's combine everything into a realistic scenario. Your home directory is full of loose files:
ls ~ app.js index.html notes.txt package.json old-report.pdf server.js styles.css Clean it up in a few commands:
mkdir -p ~/web/{src,docs,reports} # create the structure in one line mv *.js *.css *.html ~/web/src/ # move code files mv notes.txt ~/web/docs/ mv old-report.pdf ~/web/reports/ Then verify:
find ~/web -type f /home/yeasin/web/src/app.js /home/yeasin/web/src/server.js /home/yeasin/web/src/index.html /home/yeasin/web/src/styles.css /home/yeasin/web/docs/notes.txt /home/yeasin/web/reports/old-report.pdf That {src,docs,reports} syntax is brace expansion — another shell trick worth remembering. mkdir -p a/{one,two,three} creates three subdirectories instantly.
Common Mistakes and Troubleshooting
1. "No such file or directory" — but the file is right there
Linux paths are case-sensitive: Notes.txt is not notes.txt. Use ls and tab completion (press Tab to auto-complete names) to avoid typos entirely.
2. Deleted something you needed
No recycle bin exists, so recovery depends on backups. The lesson: build the list-first habit, and use mv to a "trash" folder instead of rm for anything you might miss:
mkdir ~/.trash mv important.txt ~/.trash/ 3. cp says "omitting directory"
You forgot -r. Directories always need cp -r.
4. Running out of space — finding the culprit
df -h # disk usage per filesystem du -sh /var/* | sort -h # which folders are big find ~ -size +500M # huge files in your home 5. Permission denied
Some files belong to other users or root. Don't reflexively add sudo — first check who owns the file with ls -l, and prefer fixing ownership or location rather than escalating. (chown and chmod deserve their own article — coming next in this series.)
Summary
- Linux has one filesystem tree starting at
/, with a standard directory layout — learn/home,/etc,/var, and/tmpfirst. - Navigation is three commands:
pwd(where am I),ls(what's here),cd(go there). - Create with
touchandmkdir -p; copy withcp -r; move/rename withmv. -
rmis permanent — there is no trash bin. List first (ls), then delete, and use-iwhen unsure. - View files with
less,head/tail, andtail -ffor live logs. - Find files with
find(accurate, real-time) orlocate(instant, database-based). - Wildcards (
*,?) work with every command and are expanded by the shell before the command runs.
Master these commands until they're muscle memory, and the command line stops feeling like a struggle — it starts feeling like home. Every sysadmin skill you learn next, from servers to security, builds on this foundation.
