Linux Bash Shell Useful Commands

Create a new tar archive.

$ tar cvf archive_name.tar dirname/

Extract from an existing tar archive.

$ tar xvf archive_name.tar

View an existing tar archive.

$ tar tvf archive_name.tar

Check if remote port is open with bash:

echo >/dev/tcp/ && echo "open"

Suspend process:

Ctrl + z

Move process to foreground:


Generate random hex number where n is number of characters:

openssl rand -hex n

Execute commands from a file in the current shell:

source /home/user/

Substring for first 5 characters:


SSH debug mode:

ssh -vvv [email protected]_address

SSH with pem key:

ssh [email protected]_address -i key.pem

Get complete directory listing to local directory with wget:

wget -r --no-parent --reject "index.html*" http://hostname/ -P /home/user/dirs

Create multiple directories:

mkdir -p /home/user/{test,test1,test2}

List processes tree with child processes:

ps axwef

Create war file:

jar -cvf name.war file

Test disk write speed:

dd if=/dev/zero of=/tmp/output.img bs=8k count=256k conv=fdatasync; rm -rf /tmp/output.img

Test disk read speed:

hdparm -Tt /dev/sda

Get md5 hash from text:

echo -n "text" | md5sum

Check xml syntax:

xmllint --noout file.xml

Extract tar.gz in new directory:

tar zxvf package.tar.gz -C new_dir

Get HTTP headers with curl:

curl -I

Modify timestamp of some file or directory (YYMMDDhhmm):

touch -t 0712250000 file

Download from ftp using wget:

wget -m ftp://username:[email protected]

Generate random password (16 char long in this case):

LANG=c < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-16};echo;

Quickly create a backup of a file:

cp some_file_name{,.bkp}

Access Windows share:

smbclient -U "DOMAIN\user" //

Run command from history (here at line 100):


Unzip to directory:

unzip -d dir_name

Multiline text (CTRL + d to exit):

cat > test.txt

Create empty file or empty existing one:

> test.txt

Update date from Ubuntu NTP server:


netstat show all tcp4 listening ports:

netstat -lnt4 | awk '{print $4}' | cut -f2 -d: | grep -o '[0-9]*'

Convert image from qcow2 to raw:

qemu-img convert -f qcow2 -O raw precise-server-cloudimg-amd64-disk1.img \

Run command repeatedly, displaying it’s output (default every two seconds):

watch ps -ef

List all users:

getent passwd

Mount root in read/write mode:

mount -o remount,rw /

Mount a directory (for cases when symlinking will not work):

mount --bind /source /destination

Send dynamic update to DNS server:

nsupdate < <EOF
update add $HOST 86400 A $IP

Recursively grep all directories:

grep -r "some_text" /path/to/dir

List ten largest open files:

lsof / | awk '{ if($7 > 1048576) print $7/1048576 "MB "$9 }' | sort -n -u | tail

Show free RAM in MB:

free -m | grep cache | awk '/[0-9]/{ print $4" MB" }'

Open Vim and jump to end of file:

vim + some_file_name

Git clone specific branch (master):

git clone [email protected]:name/app.git -b master

Git switch to another branch (develop):

git checkout develop

Git delete branch (myfeature):

git branch -d myfeature

Git delete remote branch:

git push origin :branchName

Git push new branch to remote:

git push -u origin mynewfeature

Print out the last cat command from history:


Run your last cat command from history:


Find all empty subdirectories in /home/user:

find /home/user -maxdepth 1 -type d -empty

Get all from line 50 to 60 in test.txt:

< test.txt sed -n '50,60p'

Run last command (if it was: mkdir /root/test, below will run: sudo mkdir /root/test):

sudo !!

Create temporary RAM filesystem – ramdisk (first create /tmpram directory):

mount -t tmpfs tmpfs /tmpram -o size=512m

Grep whole words:

grep -w "name" test.txt

Append text to a file that requires raised privileges:

echo "some text" | sudo tee -a /path/file

List all supported kill signals:

kill -l

Generate random password (16 characters long in this case):

openssl rand -base64 16

Do not log last session in bash history:

kill -9 $$

Scan network to find open port:

nmap -p 8081

Set git email:

git config --global "[email protected]"

To sync with master if you have unpublished commits:

git pull --rebase origin master

Move all files with “txt” in name to /home/user:

find -iname "*txt*" -exec mv -v {} /home/user \;

Put the file lines side by side:

paste test.txt test1.txt

Progress bar in shell:

pv data.log

Send the data to server with netcat:

echo "hosts.sampleHost 10 `date +%s`" | nc 3000

Convert tabs to spaces:

expand test.txt > test1.txt

Skip bash history:

< <space>>cmd

Go to the previous working directory:

cd -

Split large tar.gz archive (100MB each) and put it back:

split –b 100m /path/to/large/archive /path/to/output/files
cat files* > archive

Get HTTP status code with curl:

curl -sL -w "%{http_code}\\n" -o /dev/null

When Ctrl + c does not work:

Ctrl + \

Get file owner:

stat -c %U file.txt

List block devices:

lsblk -f

Find files with trailing spaces:

find . -type f -exec egrep -l " +$" "{}" \;

Find files with tabs indentation:

find . -type f -exec egrep -l $'\t' "{}" \;

Print horizontal line with “=”:

printf '%100s\n' | tr ' ' =

Soji Jacob

Location : Bangalore

You may also like...