techwiki:bash

This page contains Bash cmd info in general, and specific binary tool command in Mac and Linux.

Bash profile

user profile located at :

~/.bash_profile

edit user profile environment variable in the bash profile:

  • display:
    echo $PATH
  • display with escape
    echo \$PATH
  • display raw text:
    echo '$PATH'
  • display with variable:
    echo "Path is $PATH"
  • display block of text:
    echo << EOF
    Block of text here
    Text for $PATH
    EOF
  • display block of raw text:
    echo << "EOF"
    Block of text here
    Text Again but no $PATH
    EOF
  • session based variable set:
    path=/myPath:$PATH
  • permanently change to path in profile file:
    export PATH=/myPath:$PATH

Note: by adding your_Path_To_3rd_Party_Binary to the $PATH variable, you can directly call them in terminal.

My linux bash profile code

# User specific aliases and functions
alias fx='cd ~/App/firefox;./firefox'
# refresh fx installation
alias fxnew='cd ~/App;rm -r firefox;tar xjvf firefox-91.9.1esr.tar.bz2'

Bash tips

  • find path to a command file
    which ls
  • escape by “\”
  • create a txt file
    echo "hello" > text.txt
  • create a empty file or update a file
    touch empty.txt
  • append to a txt file
    echo "127.0.0.1\thome" >> /etc/hosts
  • create a symbolic link
    ln -s ~/real_dir ~/Desktop/alias_name
  • make folder accessible to all
    sudo chmod 777 /your_folder_name
  • batch file rename
    for i in *.JPG ; do mv $i ${i/-[0-9.]*.JPG/.JPG} ; done
  • Vi text editor
    vi
    # cmd mode
    #  i : enter text edit mode
    #  dd: delete line
    #  x : delete a char
    #  w : write file wq: save & quit
    #  q : quite q!: quit without save
    # edit mode
    # esc: back to cmd mode
    # ':':enter cmd mode
shortcut
ctrl + z suspend
ctrl + a goto cmd line start
ctrl + e goto cmd line end

Full bash terminal shortcuts: http://www.shell-tips.com/2006/10/29/working-quickly-with-some-usefull-bash-shortcuts/

quick list
man manual, q:quit man; space: next
ls ls -la: long list directory; ls -sh: list size human read
cp cp -R: recursive copy directory
mv move file
rm rm -R: recursive delete directory
mkdir make directory
source source a shell script file
| pipe prev cmd to next cmd
cmd& run cmd background
clear clear screen

bash - computer management: user, admin, network

# check users: w, who, users
#
#<----------------------------------->
# ifconfig
wifi(){
	#os x version
	ifconfig en1 | grep 'inet ' | cut -d ' ' -f 2
	# linux version
	# ifconfig en1 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
}
 
#<---------------------------------->
# kill
 
# kill by name
alias kbn=ka;
ka(){
for X in `ps acx | grep -i $1 | awk {'print $1'}`; do
  kill $X;
done
}
alias ki='ka itunes'

bash - file operation

#<---------------------------------->
# ls
 
lss(){
ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'
}
 
lsss(){
ls -trR
}
 
# ls -file tools
# ref: http://www.thegeekstuff.com/2009/07/linux-ls-command-examples/
alias a='ls'
alias aa='ls -AF'
alias aaa='ls -lF'
alias ll='ls -lF'
alias lt='ls -ltF' # by time
alias lt.='ls -ltrF' # by time reverse
alias lsB='ls -S'
alias lsS='ls -Sr'
alias lh='ls -lhF'
alias l='ls'
alias ld='ls -d */'
alias 1='ls -1F'
# find and remove all
# sudo find * -type d -name .svn -exec rm -rf {} \;
#
#<--------check md5-------------------------->
md5(){
openssl md5 "$1"
# tip: quote $1
}
 
# print directory structure
 
graph(){
set `pwd`
set `basename $1`
ls -FR>~/Desktop/$1.txt
}
 
# clean ._mac file
#find . -name ._* -exec rm '{}' 
 
# advanced sys function
 
 
uflat(){
find . -not -type d -print0 | xargs -0J % mv -f % .
find . -type d -depth 1 -print0 | xargs -0 rm -rf
}
 
# replace text; usage: urep \[array of file] [find] [replace]
urep(){
for i in $1; do j=`echo $i | sed 's/$2/$3/g'`; mv "$i" "$j"; done
 
#for i in *.txt; do j=`echo $i | sed 's/2010/2011/g'`; mv "$i" "$j"; done
}
urep2(){
rename 's/$2/$3/' $1
}
 
# rename prefix; usage: upre/upost \[array of file] [pre/post]
upre(){
for i in $1; do mv "$i" $2."$i"; done
}
upost(){
for i in $1; do mv "$i" "$i".$2; done
}
 
# switch ext; usage: uext \[array of file] [old ext] [new ext]
uext(){
for i in $1; do mv "$i" "${i/.$2}".$3; done
}
uext2(){
for i in $1; do mv "$i" "`basename $i .$2`".$3; done
}
uext3(){
rename 's/\.$2/\.$3/' $1
}
 
# rename case switch; usage: ucase \[array of file]
ucaseUnix(){
rename 'y/A-Z/a-z/' $1
}
 
# clean space in name; usage: uclean \[array of file]
ucleanUnix(){
rename 's/ //' $1
}
 
# working (test)
# add date to pre/post; usage: udate \[array of file] [pre/post] [ext]
udate(){
if [ $2 ] && [ $3 ]; then
	if [ $2 == "e" ] || [ $2 == "b" ] || [ $2 == "p" ] || [ $2 == "post" ]; then
		for i in $1
			do mv "$i" "${i/.$3}".`date '+%Y-%m-%d'`.$3
		done	
	fi
else
	for i in $1; do mv "$i" `date '+%Y-%m-%d'`."$i";done
fi
}

Get running script directory

#!/bin/bash
echo "The script you are running has basename `basename $0`, dirname `dirname $0`"
echo "The present working directory is `pwd`"
  • get file list
    find *.jpg #find all jpg in fold
  • rename find list
    for i in `find *v10*.jpg`; do j=`echo $i | sed 's/v10/v010/g'`; mv "$i" "$j"; done 
    # for each file, generate new name, replace old name with new name

bash - utility

  • get lines contains word A
    grep wordA sample.txt
  • ignore case
    grep -i wordA sample.txt
  • match exact word
    grep -w wordA sample.txt
  • inverse selection, lines without word A
    grep -v wordA sample.txt
  • count
    grep -c wordA sample.txt
  • line number
    grep -n wordA sample.txt
  • list file
    grep -l wordA *.txt
  • Pattern
    • ^wordA: line starts with wordA
    • wordA$: line ends with wordA
    • ^$: blank line
    • [set]: match one from set [0-9][A-Za-z] [abc] [x-z]
    • [:class:]: match one from class [:alnum:] [:alpha:] [:blank:] [:digit:] [:lower:] [:upper:] [:space:]
    • escape: \
    • .: any char
    • \< \>: begin/end of word
    • wordA|wordB: wordA or wordB
    • {n}: how many times appera in line {min,max}
    • ?: at most once
    • *: none to unlimited
    • +: at least once
    • ^: inverse range; begin of line

ref:http://www.cyberciti.biz/faq/howto-use-grep-command-in-linux-unix/

line editor

sed '/range/s/find/replace/g' <input >output
# same with _
sed '/range/ s_find_replace_g' <input >output
#line range ^start, $end
sed '1,100 s/find/replace/'

remove all comments in bash script

sed '/start/,/stop/ s/#.*//'

ref: http://www.grymoire.com/Unix/Sed.html#uh-0

awk is a words grabber, like grep for lines grabber

ref: http://www.grymoire.com/Unix/Awk.html

# vi
# --- change current line to lower case
# :s/.*/\L&/
 
# -- set file ending with DOS or Unix
# :set ff=dos or :set ff=unix
 
# -- mass converting dos<->unix
# vim +"argdo set ff=<format>" +wqa <files>

Mac specific binary tool

An A-Z Index of the Mac OS X command line : http://ss64.com/osx/

enable root on mac : http://support.apple.com/kb/HT1528

  • osascript
    osascript theScript.scpt
  • open : open cmd opens every thing, like “start” in DOS
  • mount smb share folder (Windows,Linux,Mac share folder by SMB)
    if [ ! -d /Volumes/me ]; then mkdir /Volumes/me; mount_smbfs //username@PCNAME/shareFolderName /Volumes/me; fi
  • Dmg file creation and convertion
    # make an DMG image name $2 from folder called $1
    dmgF(){
    echo "CMD: hdiutil create -srcdir \"$1\" $2.dmg"
    hdiutil create -srcdir "$1" "$2.dmg"
    }
     
    # make an ISO image named as $2 from folder called $1
    isoF(){
    hdiutil makehybrid -iso -o "$2.iso" "$1"
    }
     
    # burn DMG file $1
    burn(){
    hdiutil burn $1
    }
     
    # create a DMG file with size $1 MB named as $2
    dmg(){
    hdiutil create -size $1m $2.dmg -fs HFS+ -volname $2
    }
     
    # convert DMG file of $1 to an ISO image file
    dmg2iso(){
    hdiutil convert $1.dmg -format UDTO -o $1.iso
    }
  • other disk related cmds
    ################################
     
    # force reject disk
    #drutil tray open
    #drutil eject
     
    #<---------------------------------->
    vo(){
    cd /Volumes/"$1";.
    }
     
    #<---------------------------------->
    # dd function for disk dump
    #
    # dd back cd
    # dd if=/dev/disk1 of=myDVDcopy.img bs=2048
    # dd if=/dev/disk1 of=dvd.iso
     
    # dd backup disk
    # dd bs=512 if=/dev/rXX# of=/some_dir/foo.dmg conv=noerror,sync
    # dd bs=512 if=/dev/rdisk2s3 conv=noerror,sync | gzip -9 > foo.dmg.gz
     
    # file rescue
    # dd bs=512 if=/Volumes/HD1/badfile.mpg of=/Volumes/HD2/newrecoveredfile.txt conv=noerror,sync
     
    # back and split
    # dd if=/dev/hda# | gzip -9 | split -b 4096m /dev/sda#/somedir/macosx
    # cat
    # cat /dev/sda#/somedir/macosx* | gzip -d | dd of=/dev/hda# 
     
    # list disk and device
    # disktool -l
    # df -k
    # diskutil list
     
     
    #<---------------------------------->
    # disktool
    eject2 () {
    /usr/sbin/disktool -e $(df | grep $1 | awk '{print $1}' | sed 's/\/dev\///')
    }
     
    eject(){
    eject2 /Volumes/$1
    }
     
    #<---------------------------------->
    # tar
    #create tar
    #tar -czvf MyArchive Source_file 
    #tar --create --gzip --verbose --file=MyArchive Source_file
    #extract tar
    #tar -xzvf MyArchive Source_file 
    #tar --extract --gunzip --verbose --file=MyArchive Source_file
     
    #tar xjvf filename.tar.bz2
     
    #tar -pvczf BackUpDirectory.tar.gz /path/to/directory
    #tar --exclude=".*" -pvczf BackUpDirectory.tar.gz /path/to/directory
    #tar -xvzf filename.tar.gz -C /desired/path
    tarp(){
    tar -xvzf $1 -C $2
    }
    tard(){
    tar czvf $1.$(date +%Y%m%d-%H%M%S).tgz $1
    exit $?
    }
     
    #tar -czvf my_backup.$(date +%Y%m%d-%H%M%S).tgz source_file
     
    # unrar x test.part1.rar
# convert to pdf
alias pdf2="/System/Library/Printers/Libraries/convert"
pdf(){
pdf2 -f "$1" -o "$1.pdf";
}
#<---------------------------------->
# man
function wman() {
   url="man -w ${1} | sed 's#.*\(${1}.\)\([[:digit:]]\).*\$#http://developer.apple.com/documentation/Darwin/Reference/ManPages/man\2/\1\2.html#'"
   open `eval $url`
}
 
xman() {
   url="http://bashcurescancer.com/man/cmd/"
   open $url$1
}

Linux specific binary tool

  • convert
    • convert image sequence into gif
      convert -delay 50 -loop 1 render.*.jpg animation.gif
    • convert big image into small tile parts
      convert -crop 64x64 +repage big.tif small_%02d.tif
    • convert several images into one big image horizontally or vertically
      convert +append 1.jpg 2.jpg out.jpg # horizontally
      convert -append 1.jpg 2.jpg out.jpg # vertically
  • zip
    zip a folder into a zip file
    zip -9 -r myZipFile.zip myFileOrFolderName
  • xwininfo
    get window info
  • sha1sum
    get sha1 sum of a file like md5
  • 7zip
    7z file opener
    # install or http://p7zip.sourceforge.net/
    sudo apt-get install p7zip
    # extract
    p7zip e example.7z
    # more ref: http://www.dotnetperls.com/7-zip-examples

Other 3rd Party tool

  • lame - convert aiff to mp3
    lame --r3mix -q0 --id3v2-only --tt \"[title]\" --ta \"[artist]\"
    \"123.aiff\" \"123.mp3\"
  • ffmpeg - convert image & video formats (ref)
    // convert image seq into avi
    ffmpeg -f image2 -i seq.%04d.jpg -r 30 -s 640x480 -vcodec mpeg4 test.avi
      // -f: format; -i: input, %04d means 0001 like pattern; -r: framerate; -b:v video bitrate; -fs: file size limite; -s resolution; -vcodec: encode format
     
    // get info
    ffmpeg -i video.avi
     
     
    // img seq to video
    ffmpeg -f image2 -i image.%04d.jpg video.mpg
    // ref: https://ffmpeg.org/trac/ffmpeg/wiki/UbuntuCompilationGuide
    ffmpeg -r 8 -i frame.%04d.jpeg -vcodec libx264 -vpre medium -crf 24 -threads 0 -s 640x480 output.mp4
     
    // video to img seq
    ffmpeg -i video.mpg image.%04d.jpg
     
    // video to iphone mp4 or psp
    ffmpeg -i source_video.avi -acodec aac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x180 -title X final_video.mp4
     
    ffmpeg -i source_video.avi -b 300 -s 320x240 -vcodec xvid -ab 32 -ar 24000 -acodec aac final_video.mp4
     
    // save sound
    ffmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 sound.mp3
     
    // wav to mp3
    ffmpeg -i son_origine.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 son_final.mp3
     
    // mpg to avi, avi to mpg
    ffmpeg -i video_origine.avi video_finale.mpg
    ffmpeg -i video_origine.mpg video_finale.avi
     
    // video to gif
    ffmpeg -i video_origine.avi gif_anime.gif
     
    // add souble
    ffmpeg -i son.wav -i video_origine.avi video_finale.mpg
     
    // video to flv
    ffmpeg -i video_origine.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv video_finale.flv
     
    // video to dvd
    ffmpeg -i source_video.avi -target pal-dvd -ps 2000000000 -aspect 16:9 finale_video.mpeg
     
    // ogm to mpg
    ffmpeg -i film_sortie_cinelerra.ogm -s 720x576 -vcodec mpeg2video -acodec mp3 film.mpg
  • techwiki/bash.txt
  • Last modified: 2022/12/03 10:55
  • by ying