What Is Linux, Really?
Before the commands, the concepts. What you're actually working with when you sit down at a Linux terminal.
Linux is a free and open-source operating system — the software layer that sits between the hardware (CPU, memory, disk, network) and the programs you run. Every Android phone, most servers on the internet, every supercomputer on Earth, and most of the embedded systems you've never thought about all run on Linux. It is by far the most widely deployed operating system in existence.
What people casually call "Linux" is technically just the kernel — the core program that talks to the hardware. A complete usable system also needs a shell, system utilities, a package manager, and (optionally) a graphical desktop. When all those pieces are bundled together, the result is called a Linux distribution (or "distro"). Ubuntu, Debian, Fedora, Arch, and the L4T system on a Jetson are all distributions.
1.1 Why Linux is everywhere
- It is free — no licenses, no activation keys.
- It is open source — anyone can read, modify, and redistribute the code.
- It is modular — you can strip it down to a 5 MB embedded system or scale it up to a multi-thousand-core supercomputer.
- It is powerful from the command line — once you learn the shell, you can automate almost anything.
- It is stable and secure — designed from the ground up for multi-user, networked, always-on use.
1.2 How Linux differs from Windows / macOS
If you come from Windows, the biggest mental shift is that the command line is not optional — it is the primary interface for serious work. The graphical desktop is just one application running on top of the system. Most administrative tasks (installing software, configuring services, mounting drives) are still faster, clearer, and more reliable in the terminal than through any GUI.
Other key differences:
- Path separators
- Forward slashes
/, never backslashes./home/user/file, notC:\Users\user\file. - No drive letters
- Everything lives under a single tree starting at
/(the root). External drives and partitions are mounted into directories like/mnt/usb. - Extensions don't matter
- A program is executable because of its permission bits, not because it ends in
.exe. A text file can be called anything. - Case sensitivity
File.txtandfile.txtare two different files. Watch your capitalization.- Software sources
- From package repositories, not random websites.
apt install firefoxinstead of downloading a.exe.
Core Concepts You Must Understand
Eleven ideas that, once internalized, make every Linux command feel like it belongs to the same coherent system.
2.1 The filesystem hierarchy
Linux organizes everything into a single tree starting at / ("root"). Every file, every device, every drive lives somewhere under this tree. Here are the directories you will encounter most often:
| / | The root of the filesystem. Everything starts here. |
| /home/<user> | Personal files for each user. Yours might be /home/majid — abbreviated as ~. |
| /root | The home directory of the root (admin) user. Not the same as /. |
| /etc | System-wide configuration files. Things like /etc/fstab, /etc/docker/daemon.json. |
| /var | Variable data: logs (/var/log), package caches, mail spools, databases. |
| /usr | User-installed programs and libraries. /usr/bin holds most commands. |
| /bin, /sbin | Essential system commands. /sbin holds admin-only commands. |
| /tmp | Temporary files. Wiped on reboot. |
| /dev | Device files. /dev/nvme0n1 is an SSD, /dev/sda1 a partition, etc. |
| /proc, /sys | Virtual filesystems exposing kernel state. Not real files on disk. |
| /mnt, /media | Mount points for external drives and partitions you attach manually. |
| /boot | Kernel images and bootloader files. |
| /lib | Shared libraries needed by programs in /bin and /sbin. |
| /opt | Optional / third-party software, often used by vendor packages. |
The shorthand ~ always expands to your home directory. So cd ~/projects is the same as cd /home/majid/projects.
2.2 Everything is a file
This is one of Linux's foundational ideas. A regular document is a file — but so is a hard drive (/dev/nvme0n1), a USB port, a network connection, the random number generator, even running processes (/proc/1234). Programs read and write to all of them using the same operations they would use on a text file.
2.3 Users, root, and sudo
Linux is multi-user from the ground up. Every file has an owner, and every running program runs as some user. There is one special user named root who can do absolutely anything — read any file, kill any process, modify the kernel.
Logging in as root for daily work is dangerous (one typo can wipe the system), so the convention on Ubuntu/Debian is:
- Your normal account does most things — browse, edit your own files, run programs.
- When you need root power for one command, you put
sudoin front of it. Linux asks for your password, runs that one command as root, then drops back to normal. - Only users in the
sudogroup are allowed to do this. Your account is in that group by default on a fresh install.
sudo apt install nano # install software sudo mkdir /mnt/nvme # create directory in protected location sudo systemctl start docker # start a system service
2.4 File permissions
Every file in Linux has three sets of permissions: what the owner can do, what the group can do, and what everyone else can do. Each set has three flags:
- r — read
- View the contents of a file. For directories, list the files inside.
- w — write
- Modify the file. For directories, add or remove files.
- x — execute
- Run as a program. For directories, enter (cd into) it.
When you run ls -l you see something like:
-rw-r--r-- 1 majid majid 4096 May 1 17:22 notes.txt
That breaks down as: file type (- for file, d for directory, l for symlink), owner permissions (rw-), group permissions (r--), everyone-else permissions (r--), then the owner and group names.
Permissions are also written as octal numbers (each rwx group becomes a digit 0-7):
755=rwxr-xr-x— typical for executables644=rw-r--r--— typical for regular files600=rw-------— owner only (used for swapfiles, SSH keys, sensitive configs)
2.5 Processes
A process is a running instance of a program. Every process has a PID (process ID, a number), a parent process (every process is launched by another), a user it runs as, memory it has allocated, and file handles it has open.
You can list processes with ps or watch them live with top / htop. You stop a misbehaving process with kill <PID>.
2.6 The shell
The shell is the program that reads the commands you type and runs them. The default on Ubuntu is bash ("Bourne Again Shell"). Modern alternatives include zsh and fish.
Your prompt looks like this:
majid@majid-desktop:~$
Reading left to right: your username, the @ separator, the machine's hostname, the colon, your current directory (~ = home), and finally $ (which becomes # if you're root).
2.7 Streams, pipes, and redirection
Every program has three default streams:
- stdin (standard input) — where it reads from
- stdout (standard output) — where it writes results
- stderr (standard error) — where it writes error messages
By default they're all your terminal. But you can redirect them:
| cmd > file | Send stdout of cmd to file (overwrites). |
| cmd >> file | Append stdout to file. |
| cmd 2> file | Send stderr to file. |
| cmd &> file | Send both stdout and stderr to file. |
| cmd < file | Read stdin from file. |
| cmd1 | cmd2 | Pipe: send stdout of cmd1 as stdin to cmd2. |
| cmd1 && cmd2 | Run cmd2 only if cmd1 succeeded. |
| cmd1 || cmd2 | Run cmd2 only if cmd1 failed. |
Real example:
echo "/mnt/nvme/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab
This prints the line (echo), pipes it to tee, which (with sudo and the -a "append" flag) writes it to the end of /etc/fstab. The trick here: sudo echo ... > /etc/fstab wouldn't work, because the redirect is done by your shell, not by sudo.
2.8 Package management
On Ubuntu/Debian-based systems (including JetPack), software comes from packages stored in online repositories. The tool that manages them is apt.
| sudo apt update | Refresh the list of available packages. |
| sudo apt upgrade | Install newer versions of installed packages. |
| sudo apt install <pkg> | Install a package and its dependencies. |
| sudo apt remove <pkg> | Remove a package (keep config files). |
| sudo apt purge <pkg> | Remove a package and its config files. |
| apt search <term> | Search for packages by name or description. |
| dpkg -l | List all installed packages. |
2.9 Services and systemd
Long-running background programs (Docker, networking, SSH, web servers) are called services or daemons. They're managed by systemd via the systemctl command.
| systemctl status <svc> | Is the service running? Show its recent log. |
| sudo systemctl start <svc> | Start the service now. |
| sudo systemctl stop <svc> | Stop it now. |
| sudo systemctl restart <svc> | Restart it. |
| sudo systemctl enable <svc> | Start it automatically on boot. |
| sudo systemctl disable <svc> | Don't start on boot. |
| journalctl -u <svc> | Show this service's full log. |
| journalctl -u <svc> -f | Follow the log live (like tail -f). |
2.10 Mounting filesystems
In Linux, drives don't get drive letters — they get attached ("mounted") into a directory in the existing tree. Once mounted, accessing that directory means accessing the drive.
An NVMe drive setup typically looks like:
- Block device
/dev/nvme0n1— the whole disk- Partition
/dev/nvme0n1p1— the formatted partition- Mount point
/mnt/nvme— the directory it's attached to
The file /etc/fstab lists what should be auto-mounted at boot. Each line has 6 fields: source, mountpoint, filesystem type, options, dump, fsck order.
2.11 Environment variables
Variables that programs (and the shell) can read. They're spelled in UPPERCASE by convention. View one with the $ prefix:
echo $HOME # /home/majid echo $USER # majid echo $PATH # list of folders the shell searches for commands
Set one for the current shell:
export MY_VAR="hello"
Make it permanent by adding the line to ~/.bashrc (your shell's startup file).
Essential Commands by Category
A working reference. Use Parts 1 and 2 to understand why; come back here for the what.
3.2 File and directory operations
| touch <file> | Create an empty file (or update its timestamp). |
| mkdir <dir> | Create a directory. |
| mkdir -p a/b/c | Create nested directories, no error if they exist. |
| cp <src> <dst> | Copy a file. |
| cp -r <src> <dst> | Copy a directory recursively. |
| mv <src> <dst> | Move (or rename) a file or directory. |
| rm <file> | Delete a file (no recycle bin — gone forever). |
| rm -r <dir> | Delete a directory and everything in it. |
| rm -rf <dir> | Force-delete recursively. Dangerous — verify the path first. |
| ln -s <target> <link> | Create a symbolic link (shortcut). |
There is no undo. Always double-check the path, especially with -rf. The infamous rm -rf / wipes the entire system. Modern rm has guards against that exact command, but you can still trivially destroy everything in your home directory by mistake.
3.3 Viewing file contents
| cat <file> | Print entire file to terminal. Best for short files. |
| less <file> | Page through a file. Arrow keys to scroll, q to quit, / to search. |
| head <file> | First 10 lines. |
| head -n 20 <file> | First 20 lines. |
| tail <file> | Last 10 lines. |
| tail -n 50 <file> | Last 50 lines. |
| tail -f <file> | Live-follow a file (great for log files). |
| wc -l <file> | Count lines in the file. |
| wc <file> | Count lines, words, characters. |
| file <file> | Identify file type (text, binary, image, etc.). |
3.4 Editing files in the terminal
Two editors are common on Linux: nano (simple, friendly) and vim / vi (powerful, steep learning curve). For beginners, stick with nano.
| nano <file> | Open file in nano. Ctrl+O to save, Ctrl+X to quit. |
| nano +50 <file> | Open at line 50. |
| vim <file> | Open in vim. Press i to type, Esc then :wq to save and quit. |
3.5 Finding things
| find <dir> -name '*.py' | Find files matching a pattern under a directory. |
| find . -type d | Find directories only (under current location). |
| find . -size +100M | Find files larger than 100 MB. |
| grep 'text' <file> | Find lines containing 'text' in a file. |
| grep -r 'text' <dir> | Recursively search a whole directory. |
| grep -i 'text' <file> | Case-insensitive search. |
| grep -n 'text' <file> | Show line numbers. |
| which <cmd> | Show where a command lives (e.g. which python3). |
| whereis <cmd> | Show binary, source, and man page locations. |
| locate <name> | Fast filename search using a pre-built index. |
3.6 Permissions and ownership
| chmod 755 <file> | Set permissions to rwxr-xr-x (octal notation). |
| chmod +x <file> | Make executable. |
| chmod -x <file> | Remove executable bit. |
| chmod u+w,g-w <file> | Add write for owner, remove for group. |
| chown user <file> | Change owner of file. |
| chown user:group <file> | Change owner AND group. |
| chown -R user <dir> | Recursively change ownership of a directory. |
| chgrp group <file> | Change group only. |
3.7 System information and monitoring
| uname -a | Kernel version, architecture, hostname. |
| lsb_release -a | Linux distribution info. |
| hostname | The machine's name. |
| uptime | How long the system has been running, plus load average. |
| whoami | Print your username. |
| id | Your UID, GID, and group memberships. |
| date | Current date and time. |
| cal | Display a calendar. |
| free -h | Memory usage, human-readable. |
| df -h | Disk space per mounted filesystem. |
| du -sh <dir> | Total size of a directory. |
| lsblk | List block devices (drives + partitions) as a tree. |
| lspci | List PCI devices (GPU, network cards, etc.). |
| lsusb | List USB devices. |
| dmesg | Kernel ring-buffer messages (boot, hardware events). |
3.8 Process management
| ps | Snapshot of your processes in this terminal. |
| ps aux | Snapshot of ALL running processes on the system. |
| ps aux | grep firefox | Filter the process list for 'firefox'. |
| top | Live process viewer. Press q to quit. |
| htop | Better top (apt install htop). |
| kill <PID> | Politely ask process to terminate. |
| kill -9 <PID> | Force-kill (last resort). |
| killall <name> | Kill all processes by name. |
| pgrep <name> | Find PIDs by name. |
| jobs | List background jobs in this shell. |
| bg, fg | Send job to background / bring to foreground. |
| nohup cmd & | Run command, detached, surviving terminal close. |
3.9 Networking
| ping <host> | Test connectivity (ping google.com). Ctrl+C to stop. |
| ip a | Show all network interfaces and addresses. |
| ip route | Show routing table. |
| nmcli device status | NetworkManager: list interfaces. |
| nmcli device wifi list | List Wi-Fi networks. |
| nmcli device wifi connect <SSID> password <PWD> | Connect to Wi-Fi. |
| ssh user@host | Connect to a remote machine via SSH. |
| scp <src> user@host:<dst> | Copy files over SSH. |
| wget <url> | Download a file from a URL. |
| curl <url> | Fetch a URL (great for APIs). |
| ss -tuln | Listening ports (modern replacement for netstat). |
3.10 Disks and filesystems
| lsblk | Block-device tree. |
| blkid | UUIDs and filesystem types. |
| df -h | Mounted filesystems and free space. |
| du -sh <dir> | Disk used by a directory. |
| mount | Show all mounted filesystems. |
| sudo mount <dev> <dir> | Mount a device at a directory. |
| sudo umount <dir> | Unmount. |
| sudo mount -a | Mount everything in /etc/fstab. |
| sudo parted <dev> | Interactive partition editor. |
| sudo fdisk -l | List partitions on all disks. |
| sudo mkfs.ext4 <part> | Format partition as ext4. |
3.11 Archives and compression
| tar -czvf x.tar.gz <dir> | Create a gzipped tar archive. |
| tar -xzvf x.tar.gz | Extract a gzipped tar archive. |
| tar -tvf x.tar.gz | List contents without extracting. |
| zip -r x.zip <dir> | Create a zip archive. |
| unzip x.zip | Extract a zip archive. |
| gzip <file> | Compress (replaces with file.gz). |
| gunzip <file.gz> | Decompress. |
3.12 Text processing
| sort <file> | Sort lines. |
| sort -n <file> | Numeric sort. |
| uniq <file> | Remove adjacent duplicate lines (run after sort). |
| cut -d',' -f2 <file> | Cut field 2 from a comma-separated file. |
| awk '{print $1}' <file> | Print first whitespace-separated field of each line. |
| sed 's/old/new/g' <file> | Stream-edit: replace 'old' with 'new'. |
| tr 'a-z' 'A-Z' | Translate: convert lowercase to uppercase. |
| xargs | Build commands from input lines. |
3.13 Miscellaneous essentials
| man <cmd> | Open the manual page. q to quit. The most useful command. |
| <cmd> --help | Quick help text for a command. |
| history | Show your command history. |
| !42 | Re-run command number 42 from history. |
| !! | Re-run the previous command. |
| sudo !! | Re-run the previous command with sudo. |
| clear (or Ctrl+L) | Clear the terminal screen. |
| echo <text> | Print text. Useful in scripts and pipelines. |
| alias ll='ls -la' | Create a shortcut. Save in ~/.bashrc to make permanent. |
| exit (or Ctrl+D) | Close the terminal session. |
| reboot | Restart the system (needs sudo). |
| shutdown -h now | Power off the system (needs sudo). |
A Real Worked Example
The actual command sequence from setting up an NVIDIA Jetson dev board, in the order it was run. Reread it after a few weeks — most of these will become muscle memory.
4.1 Inspecting hardware and storage
lsblk shows a tree of every block device (drive) and its partitions. Useful for confirming a new drive is visible to the kernel.
lsblk
blkid prints the UUID, label, and filesystem type of a partition. UUIDs are stable identifiers that survive renaming, so you use the UUID rather than /dev/nvme0n1p1 in /etc/fstab.
sudo blkid /dev/nvme0n1p1
free, df, du — the three quick health checks for memory and disk usage.
free -h # memory + swap usage df -h /mnt/nvme # show free space on the NVMe sudo du -sh /var/lib/docker # how big is this folder?
4.2 Partitioning and formatting
parted — partition table editor:
sudo parted /dev/nvme0n1 --script mklabel gpt sudo parted /dev/nvme0n1 --script mkpart primary ext4 0% 100%
The first line wipes the disk and creates a fresh GPT partition table. The second creates one partition spanning the entire disk, hinting at ext4. The --script flag makes parted run non-interactively so it doesn't prompt.
mkfs.ext4 — create the filesystem:
sudo mkfs.ext4 -L jetson-nvme /dev/nvme0n1p1
Formats the new partition as ext4 (Linux's standard journaling filesystem) with the label jetson-nvme. The label is a friendly name; the UUID is what fstab uses.
4.3 Mounting and /etc/fstab
sudo mkdir -p /mnt/nvme sudo mount /dev/nvme0n1p1 /mnt/nvme
Persistent mount via fstab:
echo "UUID=fa4e... /mnt/nvme ext4 defaults,noatime,nofail 0 2" | sudo tee -a /etc/fstab sudo mount -a # apply all fstab entries now
Anatomy of an fstab line
- UUID=...
- What to mount. UUID survives device renaming.
- /mnt/nvme
- Where to mount it.
- ext4
- Filesystem type.
- defaults
- Sane defaults (rw, exec, suid, etc.).
- noatime
- Don't update last-access timestamps. Faster, less SSD wear.
- nofail
- Don't block boot if drive is missing.
- 0
- Dump flag (legacy, almost always 0).
- 2
- fsck order at boot (0=skip, 1=root only, 2=other).
4.4 Taking ownership
sudo chown -R $USER:$USER /mnt/nvme
Recursively changes the owner and group of /mnt/nvme to your user. The shell expands $USER to your username before running the command. The -R flag means "recursive" — apply to everything inside.
4.5 Creating a swapfile
sudo fallocate -l 8G /mnt/nvme/swapfile sudo chmod 600 /mnt/nvme/swapfile sudo mkswap /mnt/nvme/swapfile sudo swapon /mnt/nvme/swapfile
Step by step:
fallocate -l 8G— instantly reserve 8 GB on disk (no zero-fill, fast).chmod 600— make it owner-only readable/writable. Mandatory —mkswaprefuses otherwise.mkswap— write swap-format header so the kernel recognizes it.swapon— activate it now. Adding a fstab entry auto-activates at boot.
4.6 Copying with rsync
sudo rsync -aP /var/lib/docker/ /mnt/nvme/docker/
rsync is a smart copy tool. -a means "archive mode" — preserve permissions, ownership, timestamps, and symlinks. -P combines progress display and resume support. The trailing slash on the source (/var/lib/docker/) means "copy the contents of this directory" rather than the directory itself.
4.7 Editing config files via heredoc
sudo tee /etc/docker/daemon.json > /dev/null <<'EOF' { ... json content ... } EOF
This is a heredoc — everything between <<'EOF' and the closing EOF is fed to tee as input, which writes it to the file. The > /dev/null silences the echo back to terminal. Useful for atomic config writes without nano typos.
4.8 Adding yourself to a group
sudo usermod -aG docker $USER groups $USER # verify newgrp docker # activate in current shell
-aG: a = append (don't replace existing groups), G = supplementary group. Without -a, you would replace ALL your other groups with just "docker" and lock yourself out of sudo.
Group changes only take effect after login, so newgrp docker gives the current shell the new permissions immediately. A logout/login makes it permanent everywhere.
4.9 Controlling services with systemctl
sudo systemctl status docker --no-pager sudo systemctl stop docker sudo systemctl stop docker.socket sudo systemctl stop containerd sudo systemctl start docker
The --no-pager flag prevents systemctl from opening less — useful when piping output to head or capturing it in a script.
4.10 Installing software with apt
sudo apt install -y nano
The -y flag answers "yes" to the confirmation prompt. Use carefully — it commits to the install without showing you the package list first.
4.11 Docker quick-reference
| docker --version | Show Docker version. |
| docker info | Show daemon configuration (data root, runtimes...). |
| docker run --rm hello-world | Run a test container; --rm auto-deletes when it exits. |
| docker run -it ubuntu bash | Run interactive Ubuntu shell in a container. |
| docker ps | List running containers. |
| docker ps -a | List all containers (including stopped ones). |
| docker images | List downloaded images. |
| docker pull <image> | Download an image without running it. |
| docker stop <id> | Politely stop a running container. |
| docker rm <id> | Remove a stopped container. |
| docker rmi <image> | Remove an image. |
| docker logs <id> | Show a container's logs. |
| docker exec -it <id> bash | Open a shell inside a running container. |
| docker system prune | Free up space (removes stopped containers, unused images...). |
Shortcuts, Tips, and Pitfalls
The small habits and ten-second tricks that separate someone who lives in the terminal from someone who's just visiting.
5.1 Keyboard shortcuts that change your life
| Tab | Auto-complete file/command names. Press TWICE for suggestions. |
| Ctrl+C | Cancel the running command. |
| Ctrl+D | End-of-input. Closes shells, exits programs. |
| Ctrl+L | Clear screen (same as clear). |
| Ctrl+R | Search command history backwards. Keep pressing for older. |
| Ctrl+A / Ctrl+E | Jump to start / end of line. |
| Ctrl+U / Ctrl+K | Delete from cursor to start / end of line. |
| Ctrl+W | Delete previous word. |
| Ctrl+Z | Suspend current process (resume later with fg). |
| Up / Down arrows | Cycle through previous commands. |
| Alt+. (or Esc + .) | Insert last argument of previous command. |
| Ctrl+Shift+C / V | Copy / paste in most terminal emulators. |
5.2 Tab completion is your best friend
Almost every modern shell command supports Tab completion. Type the first few letters and press Tab — the shell will fill in file names, command names, package names, even Git branches. If there are multiple matches, Tab twice shows them all.
5.3 Read the manual
Almost every command has a manual page accessible via man:
man ls man chmod man fstab
Inside man, / searches, n / N jumps to next/previous match, q quits. For a brief built-in help, most commands also accept --help:
ls --help | less
5.4 Common pitfalls
- Forgetting sudo. If a command says "permission denied" while modifying system files, you probably need
sudo. - Putting sudo in front of a pipe / redirect.
sudo echo x > /etc/fstabdoesn't work because the redirect is performed by your shell, not bysudo. Usesudo teeinstead. - Spaces in arguments.
rm my filetries to delete two files. Quote it:rm "my file". - Hidden files. Files starting with
.(like.bashrc) are hidden fromlsby default. Usels -a. - Case sensitivity.
Documentsanddocumentsare different folders. - Deleting symbolic link contents.
rm -rf link/with the trailing slash can follow the link and delete its target. Drop the slash to delete just the link. - Editing files without backups. Before editing important configs, copy them:
sudo cp /etc/fstab /etc/fstab.bak. - Forgetting
&&vs;. With;the second command runs even if the first failed. With&&it only runs on success — much safer for sequences.
A useful test for destructive commands. Before running rm -rf foo*, replace rm with ls: ls foo*. If ls shows the files you intend to delete, the rm command is safe. If it shows surprises, you just dodged a disaster.
5.5 Ten habits to build
- Read what's on screen before pressing Enter. The shell does not protect you.
- Use Tab completion for every path. Less typing, fewer mistakes.
- Test
rmwithlsfirst. Replacermwithlsto verify the same glob matches the right files. - Back up before editing system configs. A
.bakcopy costs nothing and saves hours. - When in doubt,
man <cmd>or add--help. Faster than Googling. - Keep notes. A file like
~/notes/setup.mdpays for itself a hundred times. - Use
historyto recover "what did I just do?" Especially after a long debugging session. - Prefer absolute paths in scripts. Relative paths break when
cdgets involved. - Read error messages slowly. They almost always tell you what's wrong.
- Never paste a command from the internet without understanding what each part does. Especially anything starting with
sudo.
5.6 Going deeper
When you're ready for the next level, look into:
- Bash scripting
- Automate repetitive sequences. The "Bash Guide for Beginners" is a good start.
- Vim or Neovim
- Once you climb the learning curve, editing speed jumps dramatically.
- tmux
- Keep sessions alive across SSH disconnects, run multiple panes side by side.
- SSH keys
- Passwordless secure login between machines.
- git
- Version control. The universal tool of modern development.
- cron / systemd timers
- Schedule tasks to run automatically.
- Regular expressions
- Supercharge
grep,sed,find, and almost every text tool.
Skim Part I once. Read Part II carefully. Use Parts III and IV as references — come back when you need a specific command. Revisit Part V every couple of weeks until the habits stick.
The fastest way to learn Linux is to use it daily. Within a month you will be doing things you can't imagine right now.