NOTE 1: This page contains some shell magic which I came across in my daily business. I will update this page continuously and this will be reflected on this page in the date information displayed under the post name.

NOTE 2: Please be advised that some commands listed here could have unwanted effects if you are not completely sure of what they are doing and how they are doing it. Some of them might also require sudo access, so I am just going to assume that you know what you are doing. You have been warned!

11. From uppercase to lowercase and from space to underscore

echo 'Building REST services with Spring' | tr '[:upper:]' '[:lower:]' | tr ' ' '_' | xclip -sel c

Transform tr uppercase letters [:upper:] to lowercase [:lower:], then replace the space with an underscore _ and finally copy xclip the result to clipboard -sel c. After this you can paste the text wherever you need it. To prove the usefulness of this, instead of copying the result into the clipboard, pipe it into xargs to, for instance, create a folder, like: ...| xargs mkdir -p.


10. Execute a program periodically

watch du -sh <folder>

Execute the du command periodically, every 2 seconds, until interrupted. The command displays only the total size -s of the <folder>, in a human readable format -h.


9. Display file space usage in human readable format

du -hc . | sort -rh | head -5

Display size in human readable format -h, producing a grand total -c, then sort the output in reversed order -r by comparing human readable sizes -h, and finally taking only the first five lines of the output.


8. Search for a pattern inside files

grep -rnw . -e 'pattern'

Search in the current . directory, recursively -r, matching -e the pattern pattern, considering only whole words -w, displaying the line number -n of the match.


7. Forcibly removing all directories and their content recursively

ls -l | grep '^d' | awk '{print $9}' | xargs rm -rf

In plain English, list the content of the current directory ls using the long listing format -l, filter out everything else that is not a directory grep '^d', extract the 9^th^ column (the last containing the name of the directory) awk '{print $9}', pass each name of the directory as an argument xargs to the command rm, which removes recursively -r and forcibly -f the respective directory.


6. Switching between GitHub remote URLs (HTTPS vs. SSH)

git remote -v
git remote set-url origin git@github.com:USERNAME/REPOSITORY.git
git remote set-url origin https://github.com/USERNAME/REPOSITORY.git

First we check what kind of remote URLs we have, using option -v of command git remote, afterwards we change the remote URL to either HTTPS or SSH using one of the last two commands (note the two different URL styles for setting the remote name origin). Do not forget to replace the USERNAME and REPOSITORY with the real values.


5. Searching for files and creating an archive out of them

find . -type f \( -name file1 -o -name file2 \) | zip -@ -j files
mv files.zip ~/tmp
cd $_
xdg-open .

First we search in the current . directory for entries denoting files -type f having the name -name file1 or -o file2. The zip command takes the list of files -@ and creates an archive with the name files containing only the files without storing the directories where they reside. After moving mv the archive to the tmp directory we cd into it, $_ references the last argument of the previous command, and open xdg-open the current directory . with the appropriate program - in my case this is Files.


4. Manage processes from the Terminal

# display Linux processes
top

# top improved, you might need to install it
htop

# list all running processes and look for a specific process
ps -A | grep chrome

# display processes in a tree like format
pstree

# look up a process based on name
pgrep chome

# kills process identified by the PID, use -9 or -KILL to force kill
kill PID

# kill process given its name
pkill chrome
killall chrome

# allows killing graphical programs
# run it and your cursor will turn into x, then click a program's window
xkill

3. Print content of $PATH line-by-line

echo $PATH | tr ':' '\n'

Pipes the content, obtained via echo, of the PATH variable into the translate tr command which replaces each occurrence of : with a new line \n.

Another example:

echo line1:line2 | tr ':' '\n'
line1
line2

2. Show all users

cat /etc/passwd | awk -F: '{print$1}'

The content of the file passwd is pipped into the awk, which takes each line and splits it into columns by the defined -F separator : printing out the first value (the user name).


1. Show all hidden files

ls -lap | grep -v / | awk '{print $9}' | grep '^\.'

List ls all -a content of the current directory using the long listing format -l appending -p a forward slash / if the entry is a directory, then print only those lines which do not end with a forward slash (grep performs a pattern matching, while -v inverts the match). awk prints out the nineth column of the line - the name, and the last grep shows only those which begin with a ..