# You Don't Need GUI ## copy a file **STOP DRAG AND DROPPING A FILE, OR CMD/CTRL + C, CMD/CTRL + V A FILE** :-1: Copy `readme.txt` to the `documents` directory ```shell $ cp readme.txt documents/ ``` ## duplicate a file **STOP RIGHT CLICKING AND DUPLICATE A FILE** :-1: ```shell $ cp readme.txt readme.bak.txt ``` More advanced: ```shell $ cp readme{,.bak}.txt # Note: learn how the {} works with touch foo{1,2,3}.txt and see what happens. ``` ## copy a directory **STOP DRAG AND DROPPING A DIRECTORY, OR CMD/CTRL + C, CMD/CTRL + V A DIRECTORY** :-1: Copy `myMusic` directory to the `myMedia` directory ```shell $ cp -a myMusic myMedia/ # or $ cp -a myMusic/ myMedia/myMusic/ ``` ## duplicate a directory **STOP RIGHT CLICKING AND DUPLICATE A DIRECTORY** :-1: ```shell $ cp -a myMusic/ myMedia/ # or if `myMedia` folder doesn't exist $ cp -a myMusic myMedia/ ``` ## move a file **STOP DRAG AND DROPPING A FILE, OR CMD/CTRL + X, CMD/CTRL + V A FILE** :-1: ```shell $ mv readme.txt documents/ ``` **Always** use a trailing slash when moving files, [for this reason](http://unix.stackexchange.com/a/50533). ## rename a file **STOP RIGHT CLICKING AND RENAME A FILE** :-1: ```shell $ mv readme.txt README.md ``` ## move a directory **STOP DRAG AND DROPPING A DIRECTORY, OR CMD/CTRL + X, CMD/CTRL + V A DIRECTORY** :-1: ```shell $ mv myMedia myMusic/ # or $ mv myMedia/ myMusic/myMedia ``` ## rename a directory **STOP RIGHT CLICKING AND RENAME A DIRECTORY** :-1: ```shell $ mv myMedia/ myMusic/ ``` ## merge directories **STOP DRAG AND DROPPING TO MERGE DIRECTORIES** :-1: ```shell $ rsync -a /images/ /images2/ # note: may over-write files with the same name, so be careful! ``` ## create a new file **STOP RIGHT CLICKING AND CREATE A NEW FILE** :-1: ```shell $ touch 'new file' # updates the file's access and modification timestamp if it already exists # or $ > 'new file' # note: erases the content if it already exists ``` ## create a new directory **STOP RIGHT CLICKING AND CREATE A NEW DIRECTORY** :-1: ```shell $ mkdir 'untitled folder' # or $ mkdir -p 'path/may/not/exist/untitled folder' ``` ## show file/directory size **STOP RIGHT CLICKING AND SHOW FILE/directory INFO** :-1: ```shell $ du -sh node_modules/ ``` ## show file/directory info **STOP RIGHT CLICKING AND SHOW FILE/DIRECTORY INFO** :-1: ```shell $ stat -x readme.md # on macOS $ stat readme.md # on Linux ``` ## open a file with the default program **STOP DOUBLE CLICKING ON A FILE** :-1: ```shell $ xdg-open file # on Linux $ open file # on MacOS $ start file # on Windows ``` ## open a file in any application **STOP RIGHT CLICKING AND OPEN WITH** :-1: ```shell $ open -a appName file ``` ## zip a directory **STOP RIGHT CLICKING AND COMPRESS DIRECTORY** :-1: ```shell $ zip -r archive_name.zip folder_to_compress ``` ## unzip a directory **STOP RIGHT CLICKING AND UNCOMPRESS DIRECTORY** :-1: ```shell $ unzip archive_name.zip ``` ## decompress files of any format **STOP RIGHT CLICKING AND UNCOMPRESS DIRECTORY** :-1: ```shell $ unar archive_name.zip $ unar archive_name.7z $ unar archive_name.rar $ unar archive_name.ISO $ unar archive_name.tar.gz ``` ## peek files in a zip file **STOP USING WinRAR** :-1: ```shell $ zipinfo archive_name.zip # or $ unzip -l archive_name.zip ``` ## peek files in a compress file of any format **STOP USING WinRAR** :-1: ```shell $ lsar -l archive_name.zip $ lsar -l archive_name.7z $ lsar -l archive_name.ISO $ lsar -l archive_name.rar $ lsar -l archive_name.tar.gz ``` ## remove a file **STOP RIGHT CLICKING AND DELETE A FILE PERMANENTLY** :-1: ```shell $ rm my_useless_file ``` **IMPORTANT**: The `rm` command deletes `my_useless_file` permanently, which is equivalent to move `my_useless_file` to Recycle Bin and hit Empty Recycle Bin. ## remove a directory **STOP RIGHT CLICKING AND DELETE A DIRECTORY PERMANENTLY** :-1: ```shell $ rm -r my_useless_folder ``` ## remove all files of certain criteria ```shell $ find . -name "*.bak" -type f -delete ``` **IMPORTANT**: run `find . -name "*.bak" -type f` first to see exactly which files you will remove. ## list directory contents **STOP OPENING YOUR FINDER OR FILE EXPLORER** :-1: ```shell $ ls my_folder # Simple $ ls -la my_folder # -l: show in list format. -a: show all files, including hidden. -la combines those options. $ ls -alrth my_folder # -r: reverse output. -t: sort by time (modified). -h: output human-readable sizes. ``` ## tree view a directory and its subdirectories **STOP OPENING YOUR FINDER OR FILE EXPLORER** :-1: ```shell $ tree # on Linux $ find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g' # on MacOS # Note: install homebrew (https://brew.sh) to be able to use (some) Linux utilities such as tree. # brew install tree ``` ## find a stale file **STOP USING YOUR FILE EXPLORER TO FIND A FILE** :-1: Find all files modified more than 5 days ago ```shell $ find my_folder -mtime +5 ``` ## show a calendar **STOP LOOKING UP WHAT THIS MONTH LOOKS LIKE BY CALENDAR WIDGETS** :-1: Display a text calendar ```shell $ cal ``` Display selected month and year calendar ```shell $ cal 11 2018 ``` ## find a future date **STOP USING WEBAPPS TO CALCULATE FUTURE DATES** :-1: What is today's date? ```shell $ date +%m/%d/%Y ``` What about a week from now? ```shell $ date -d "+7 days" # on Linux $ date -j -v+7d # on MacOS ``` ## use a calculator **STOP USING CALCULATOR WIDGET** :-1: ```shell $ bc -l ``` ## force quit a program **STOP CTRL + ALT + DELETE and choose the program to kill** :-1: ```shell $ killall -9 program_name ``` ## check server response **STOP OPENING A BROWSER** :-1: ```shell $ curl -i umair.surge.sh # curl's -i (--include) option includes HTTP response headers in its output. ``` ## view content of a file **STOP DOUBLE CLICKING A FILE** :-1: ```shell $ cat apps/settings.py # if the file is too big to fit on one page, you can use a 'pager' (less) which shows you one page at a time. $ less apps/settings.py ``` ## search for a text in a file **STOP CMD/CTRL + F IN A FILE** :-1: ```shell $ grep -i "Query" file.txt ``` ![grep](./grep.jpg) ## search in all files in current working directory, quickly (entire disk in less than 15 minutes) **STOP CMD/CTRL + F IN A DIRECTORY** :-1: ```shell $ ripgrep -i "Query" # brew install ripgrep ``` ## view an image **STOP USING PREVIEW** :-1: ```shell $ imgcat image.png # Note: requires iTerm2 terminal. ``` ## show disk size **STOP RIGHT CLICKING DISK ICON OR OPENING DISK UTILITY** :-1: ```shell $ df -h ``` ## check cpu usage, processes and RAM **STOP OPENING YOUR ACTIVITY MONITOR OR TASK MANAGER** :-1: ```shell $ top ``` if you want some more details: ```shell $ htop ``` ## know whether your computer is under load, and whether it's due to memory or CPU ```shell $ glances # brew install glances ``` ## poweroff or reboot your computer This can be useful when you're patching a server that is accessed via SSH and you don't have a GUI. ```shell # poweroff $ sudo shutdown -h now # reboot $ sudo shutdown -r now ``` ## locate USB drives ```shell $ df ``` ## unmount USB drives ```shell $ sudo umount /dev/sdb1 ``` ## format USB drives ```shell # FAT32 $ sudo mkfs.vfat /dev/sdb1 # NTFS $ sudo mkfs.ntfs /dev/sdb1 # exFAT $ sudo mkfs.exfat /dev/sdb1 ``` ## check USB format ```shell $ sudo fsck /dev/sdb1 ``` ## run command on all files of a directory **STOP CLICKING THE FILES ONE BY ONE** :-1: ```shell $ for FILE in *; do echo $FILE; done ``` ## check network connectivity to a remote address and port **STOP USING NETWORK UTILITY** ```shell $ nc -vz www.google.com 443 $ nc -vz 1.1.1.1 53 ``` ## check DNS config of a domain **STOP USING NETWORK UTILITY** ```shell $ dig www.google.com ``` ## check the ownership and registration of a domain **STOP USING NETWORK UTILITY AND THE WEBSITE OF DOMAIN REGISTRATION PROVIDERS** ```shell $ whois www.google.com ``` ## Hotkeys ``` Ctrl + A Go to the beginning of the line you are currently typing on Ctrl + E Go to the end of the line you are currently typing on Ctrl + L Clears the Screen, similar to the clear command Ctrl + U Clears the line before the cursor position. If you are at the end of the line, clears the entire line. Ctrl + H Same as backspace Ctrl + R Lets you search through previously used commands Ctrl + C Kill whatever you are running Ctrl + D Exit the current shell Ctrl + Z Puts whatever you are running into a suspended background process. fg restores it. Ctrl + W Delete the word before the cursor Ctrl + K Clear the line after the cursor Ctrl + T Swap the last two characters before the cursor Ctrl + F Move cursor forward one character Ctrl + B Move cursor backward one character Esc + T Swap the last two words before the cursor Alt + T Same as Esc + T Alt + F Move cursor forward one word on the current line Alt + B Move cursor backward one word on the current line Esc + F Same as Alt + F Esc + B Same as Alt + B Alt + . Paste the last word of the most recently command Tab Auto-complete files and directory names ```