Useful Linux commands
The one-stop shop for all your Linux command needs. Most commands listed will work on our machines, though that can vary based on installed packages and/or operating systems.
For almost every command, you can use the --help argument, <command> --help
to get detailed information about the command as well as a list of its arguments.
Contents
File and Directory Management
ls
Lists all files and directories
ls -a
- List all files, including hidden ones like .ssh, .bashrc, and so on.ls -l
- Include extra file information like permissions, owner, groups, modified date, and more.ls -s
- List size of files in blocks.ls -S
- List by size, largest first.
cd
Used to change the directory.
cd
- When no path is specified, you will move to the user's home directory. As root, you will move to/root/
. As your user, you will move to/eccs/home/<username>/
.cd /path/to/file
- When changing directories, if you're not in the immediate parent directory, you need to specify the full path. For example, if my current working directory is/etc
, I cancd jupyterhub
since it's within/etc
. However, if my current working directory is/bin
, I would have to specify the full path for/etc/jupyterhub
.cd .
andcd ..
- The . and .. are used for adjacent movement.cd .
"moves" you into the current directory, so basically no movement.cd ..
moves you backwards one directory.cd -
- The dash specification takes you to the previous working directory regardless of adjacency.
pwd
Displays the current working directory. This can be usual on certain machines that don't display the full path of your current working directory, like Whedon.
root@w0 plugins # pwd /etc/nagios/plugins
In the above example, my current working directory is /etc/nagios/plugins
, but the prompt only lists it at nagios.
mkdir
Used to create directories.
- You can use
mkdir directory_name
to create it in your current working directory. - Additionally, you may specify the full path to create the directory somewhere else
mkdir /path/to/directory_name
.
rmdir
Used to remove empty directories.
- You can ONLY remove empty directories. You cannot specify recursive or force.
mv
Used to move and rename files.
- This command uses a
mv /path/to/file /path/to/destination
syntax. It follows the same rules ascd
in that you need to specify the full path unless moving to the current working directory or an adjacent directory. - To rename a file, you can "move" it into a new one.
mv old.txt new.txt
will put the contents of old.txt into the newly created new.txt. This action will delete old.txt. NOTE: This WILL overwrite the file if you move it into a preexisting one. mv -i
- If you're worried about overwriting files, you can use the -i specification. This will prompt you for confirmation before overwriting.
rm
Used to remove files and/or directories. Unlike rmdir
, you can use rm
to remove directories. Even ones that aren't empty.
rm -d
- Essentially the same asrmdir
; it can only remove empty directories.rm -r
- Recursively removes files and directories from a directory, including itself.rm -rf
- The same process asrm -r
, except it bypasses any locks or protections on files and deletes them. Only use this command if you are certain you understand what you're deleting, especially if you're root.- The
*
isis a powerful wildcard in Linux that allows you to match multiple files efficiently when using commands likerm
. For example, take a look at this directory:
tdjones22@bowie:~/directory$ ls 123.txt 131.txt 14.txt 1file.txt 208.txt 263.txt 62.txt code.py code.rb config.confLet's say you want to remove every file that starts with the number 1. You can use
rm *1
to remove any file matched with the first character being 1.
Files left after the command:208.txt 263.txt 62.txt code.py code.rb config.confLet's say you want to remove files with a specific extension. You can use
rm *.txt
to remove every file with the .txt extension.
Files left after the command:code.py code.rb config.conf
cp
Used to copy files and/or directories. Similar to rm
in that you need to specify recursive when copying a non-empty directory. It follows a cp /path/to/file /path/to/destination
syntax.
cp -r
- Recursively copies a directory; the only way, usingcp
, to copy a directory that isn't empty.
find
A tool to find files using many criteria including name, type, contents of file, and more. A common syntax for this command is find /starting/directory -specification "name_of_file.txt"
.
find / -name "name.txt"
- A typical usecase forfind
is searching by file name. If I've lost track of a file namedfound_file.txt
, I can search the entire machine for it using this command:
tdjones22@bowie:~$ find / -name "found_file.txt" 2>/dev/null /earlhamcs/eccs/users/tdjones22/directory/found_file.txtThis command will usually take some time to execute fully, so don't be alarmed when it hangs for a few seconds.
The starting directory was specified as/
which is just the parent directory, meaning it searches the entire file system. The search type was specified as-name
, which looks for matching named files. You can additionally add2>/dev/null
to silence all of the permission errors you'll get when searching all of the machine's directories.
find / -name "*.txt" -exec grep -iIl "contents to search for" {} + 2>/dev/null
- If you know a portion of the contents of a file, but you don't know the name, you can usefind
in tandem withgrep
to find it. Though, it's far easier and more convenient to only usegrep
.
Let's say I have a missing text file, but I know it contains "solar power", I can find it like so:
tdjones22@bowie:~$ find / -name "*.txt" -exec grep -RiIl "solar power" {} + 2>/dev/null /eccs/home/tdjones22/test_find.txtLike the previous command, this will take a hot minute to complete.
The starting directory was specified as/
which is just the parent directory, meaning it searches the entire file system. We're looking for a file by its name specified as"*.txt"
, which looks for any files with the .txt extension. The-exec grep -iIl "solar power" {} +
section is what searches through the file's contents. The grep arguments specify the following:-l
- ignore case,-I
- ignore binary files, and-l
- display file name. You can additionally add2>/dev/null
to silence all of the permission errors you'll get when searching all of the machine's directories.
File Permissions and Ownership
chmod
Used to add, remove, or change file permissions. You normally specify permissions using an octal format, but you may also use symbolic as well. Here are some common chmod commands; full access for a user implies read, write, and execute ability:
chmod 600
|rw-------
- The owner can read/write, but there is no access for others. Some use cases are private files and SSH keys.chmod 644
|rw--w-r--
- The owner can read/write, but others can only read. Useful for config files and public web files.chmod 660
|rw-rw----
- The owner and group can read/write, but there is no access for others. Useful for files used specifically in group collaboration.chmod 664
|rw-rw-r--
- The owner and group can read/write, but others can only read. Useful for files used specifically in group collaboration.chmod 700
|rwx------
- The owner has full access, but there is no access for others. Useful for private scripts (since you need the ability to execute a script) and sensitive directories.chmod 755
- |rwxr-xr-x
The owner has full access, but others can only read and execute. Useful for certain executables and web directories.chmod 775
|rwxrwxr-x
- The owner and group have full access, but others can only read and execute. Useful for group-managed directories.chmod 777
|rwxrwxrwx
- Everyone, and I mean everyone, has full access. So...don't use this unless absolutely necessary.
chown
Used to change which user, group, or both own files and directories.
chown user file
- Change the owner offile
touser
.chown user:group file
- Change both owner and group offile
.chown :group file
- Change only group offile
.chown -R user:group directory/
- Recursively change owner and group for all files indirectory/
.
chgrp
Used to change only the owner of both files and directories.
chgrp group file
- Change the group offile
togroup
.chgrp group directory/
- Change the group ofdirectory/
.chgrp group file1 file2 file3
- Change the group of multiple files.chgrp -R group directory/
- Recursively change group for all files, including the directory itself, indirectory/
.
stat
Used to view various stats about files and directories such as size, blocks, type, inode, UID/GID, last access, creation date, and more. Let's see what happens when we run stat
on the file test_find.txt
:
tdjones22@bowie:~$ stat test_find.txt File: test_find.txt Size: 27 Blocks: 8 IO Block: 4096 regular file Device: fe04h/65028d Inode: 25452759 Links: 1 Access: (0644/-rw-r--r--) Uid: (11035/tdjones22) Gid: (10000/sharedusers) Access: 2025-03-28 13:42:16.638585831 -0400 Modify: 2025-03-28 11:31:47.781444104 -0400 Change: 2025-03-28 11:31:47.781444104 -0400 Birth: 2025-03-28 11:31:47.781444104 -0400
Let's talk about the output:
Size: 27
- The file is 27 bytes.Blocks: 8
- The file occupies 8 blocks on the disk.regular file
- This is a "regular file", not a directory, symlink, etc.Device: fe04h/65028d
- The device ID of where the file is stored.Inode: 25452759
- The inode number assigned to the file. Every file and directory has a unique inode number.Links: 1
- The number of hard links to this file.(0644/-rw-r--r--)
- Permissions in octal and symbolic format.Uid: (11035/tdjones22) Gid: (10000/sharedusers)
- The user ID (Uid) of the owner and the group ID (Gid).Access: 2025-03-28 13:42:16.638585831 -0400
- The last time the file was read.Modify: 2025-03-28 11:31:47.781444104 -0400
- The last time the file's contents were modified.Change: 2025-03-28 11:31:47.781444104 -0400
- The last time metadata (permissions, ownership, etc) was changed.Birth: 2025-03-28 11:31:47.781444104 -0400
- When the file was first created.
Running this command on a directory displays the same format of output.
Process Management
ps
Used to display information about running processes. There are two common argument options when using ps
: Unix options, which need to be preceded by a dash, and BSD options, which can be grouped and do not need a dash.
ps
is a rather deep command with many specifications and shorthand syntax that is not necessarily intuitive. Here is the link to the official Bash documentation for PS1, which goes heavily into detail about the command with useful quick links at the top of the page.
Here are some common uses:
ps
- Shows only the processes running in your current terminal session.
This is typical output for running
ps
alone:PID TTY TIME CMD 1980517 pts/0 00:00:00 bash 1980970 pts/0 00:00:00 ps
PID
- The Process ID (PID) is the unique number that identifies a process.TTY
- TTY indicates the computer terminal that executed the process.TIME
- The total CPU time the process has used since it started.CMD
- The full command used to initiate the process. Includes paths and arguments.
ps -e/ps -A
- Lists all of the running processes on the machine using the standard syntax.ps -ef
- Lists all of the running processes using the full format. Let's look at what it adds on top of the standardps
:
UID
- The User ID (UID), usually a username, that owns the process.PPID
- The Parent Process ID (PPID).C
- The CPU usage in percentage over the process's runtime.STIME
- The time inHOUR:MINUTE
format that the process started.
ps -u user
- List all of the running processes for a specified user.ps -eH
- List all of the running processes in a hierarchical view. It visually indents processes in a human-readable syntax.
920 ? 00:00:29 sshd 1980491 ? 00:00:00 sshd 1980516 ? 00:00:00 sshd 1980517 pts/0 00:00:00 bash 1983776 pts/0 00:00:00 psThis is the process hierarchy of my bash shell (1980517), via ssh, running the
ps -eH
command.
ps aux
- List all processes (a) for all users (u) using the wide syntax (x).
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND tdjones+ 1984316 0.0 0.0 9984 3488 pts/0 R+ 14:17 0:00 ps auxLet's talk about the wide syntax columns:
%CPU
- CPU usage.%MEM
- Memory usage.VSZ
- Virtual memory size in KB. It includes all code, data, and shared libraries.RSS
- Resident Set Size (RSS) is the actual physical memory used in KB.STAT
- The state of the command.
ps -o
- The-o
argument allows you to specify the format of the output. Here is a command with all of the possible specifications:
ps -o user,pid,ppid,%cpu,%mem,vsz,rss,tty,stat,start,time,cmdYou can specify these in any order.
-- Major Overhaul: March 2025 by Tyler Jones [tdjones22] --