Linux Command Line Notes
Tags: commandline, linux
Published: 2024-01-15 14:33:14

Reference for basic command line commands for Linux, because I always forget a lot of these.

## Show current working directory
```
pwd
```

## See username
```
whoami
```

## Changing directories
Move to root/top directory
```
cd /
```

Move to user home directory
```
cd ~
```
or just
```
cd
```

Go up one directory level
```
cd ..
```

## Print to screen
```
echo "Hello world!"
```

## Creating directories and file
Create new directory 
```
mkdir new_directory
```

Create multiple directories
```
mkdir dir1 dir2 dir3 dir4
```

You can't make new nested directories with `mkdir`. To do so, use the `-p` flag for "make parent directories"
```
mkdir -p new_directory/test_files/dir1
```

Create new file
```
touch new_file.txt
```

Use redirect to create simple files for testing etc. This will create a file if it's not already there. If there is already a file with the same name present, it will overwrite it so be careful!
```
echo "Hello world" > test.txt
```

## Appending to a file
Using `>` to add something to a file will overwrite what was there before. Use `>>` to append to the end of file without overwriting everything.
```
echo "Appending some text!" >> myfile.txt
```

## View directory contents
List all directories and files in current working directory excluding hidden ones
```
ls
```

Also show hidden files:
```
ls -a
```

See file permissions and more info (long format)
```
ls -l
```

## Viewing files
Use `cat` to simply print the all the contents to the screen
```
cat config.txt
```

This can be done with multiple file names to see contents of multiple files
```
cat config.txt test.txt hello.txt
```

Use the `less` pager program to view files in an interactive pager.
```
less super_long_text.txt
```

## Using Wildcards * and ?
`?` will match any single character.

For example, if you have multiple files like `test_1.txt`, `test_2.txt` and `test_3.txt`, you could print out all files like so:
```
cat test_?.txt
```

`*` will match zero or more characters.

For example, remove all `mp3` files:
```
rm *.mp3
```

## Moving and renaming files and directories
Use `mv` to move or rename files 
```
mv <file_to_move> <destination_to_move_it>
```

Example: move `test.txt` to the `testing` directory one level above
```
mv text.txt ../testing
```

You can move multiple files/directories at once. List all the files/directories to move first. The last item will serve as the destination directory. The command below will move `file.txt`, `dir1`, and `file2.txt` to the `dir2` directory.
```
mv file.txt dir1 file2.txt dir2
```

Example: rename `test.txt` to `unit_tests.txt`
```
mv text.txt unit_tests.txt
```

Example: rename `testing` directory to `unit_tests`
```
mv testing unit_tests
```

## Copying file
Copy to a new directory
```
cp <file_to_copy> <direcory_to_copy_to>
```

Example: Make a copy of `config.txt` in the `backup` directory
```
cp config.txt backup
```

Copy a file to the same directory with a new name
```
cp <file_to_copy> <new_name_for_copied_file>
```

Example: Create a copy of `essay.txt` in the current directory and name it `essay_edit.txt`
```
cp essay.txt essay_edit.txt
```

## Removing (Deleting) files and directories
CAUTION: These commands will permanently delete things without a way to retrieve them, so make sure you're very careful!

Delete one or more files
```
rm test1.txt
rm text2.txt test3.txt
```

Delete a directory. This only works for empty directories.
```
rmdir my_folder
```

Delete a directory and any empty sub-directories using the `-p` flag. This will not delete files contained in the directories. Below would delete the `my_folder` directory and any empty subfolders it contains.
```
rmdir -p my_folder
```

Remove all directories and files in the given location (Dangerous):
```
rm -r folder_to_delete
```

## Word and line counts
Show line count, word count, and byte count of a file (in that order)
```
wc test_1.txt
>   5      10      56 test_1.txt
```
The above output tells us that `test_1.txt` has 5 lines, 10 words, and 56 bytes.

To show only line count, use the `-l` flag
```
wc -l test_1.txt
>   5 test_1.txt
```

## Sort command
Sort a file by line, that is, matching lines will be grouped together.
```
sort my_file.txt
```

## Piping
Pipes `|` allow you to feed the output of one command into the next command.

Example: See how many files/folders there are in the user's home directory
```
ls ~ | wc -l
```

`ls ~` would list all the files in the directory. Putting a pipe after it feeds the output into the `wc` word count command.

Example: Count the number of unique lines in a file. Note that `uniq` will give you only the unique lines in a file, but it only does so if the duplicated lines are next to each other.
```
sort my_file.txt | uniq | wc -l
```

## `man`: See documentation on a command
Get info about how to use a command and the available options with `man`
```
man ls
```

## Run a command as the super user
Use `sudo` followed by the command you want to run. Do this only when absolutely necessary!