# Functions gathered from around the internet
# Takes 1st argument and attempts to extract them in the current directory
extract () { # Extracts most common compressed files
        if [ -f $1 ] ; then
                case $1 in
                        *.tar.bz2)      tar xjf $1              ;;
                        *.tar.gz)       tar xzf $1              ;;
                        *.bz2)          bunzip2 $1              ;;
                        *.rar)          rar x $1                ;;
                        *.gz)           gunzip $1               ;;
                        *.tar)          tar xf $1               ;;
                        *.tbz2)         tar xjf $1              ;;
                        *.tgz)          tar xzf $1              ;;
                        *.zip)          unzip $1                ;;
                        *.Z)            uncompress $1   ;;
                        *)                      echo "'$1' cannot be extracted via extract()" ;;
                esac
        else
                echo "'$1' is not a valid file"
        fi
}
# Takes 1st argument and makes a .tar.gz archive
maketgz() { tar cvzf "${1%%/}.tar.gz"  "${1%%/}/"; }
# Takes 1st argument and makes a .zip archive
makezip() { zip -r "${1%%/}.zip" "$1" ; }
# Generate password - 1st argument is the number of characters, defaults to 20
gpass() {
        local l=$1
        [ "$l" == "" ] && l=20
        tr -dc A-Za-z0-9-!@%^*_ < /dev/urandom | head -c ${l} | xargs
}
# Shows the current PS list for the signed in user - Not cygwin compatible
myps() { ps $@ -u $USER -o pid,%cpu,%mem,bsdtime,command ; }
# Searches the process list (ps) for 1st argument
psgrep() {
        if [ ! -z $1 ] ; then
                echo "Grepping for processes matching $1..."
                ps aux | grep $1 | grep -v grep
        else
                echo "!! Need name to grep for"
        fi
}
# dirsize - finds directory sizes and lists them for the current directory
dirsize (){
        du -shx * .[a-zA-Z0-9_]* 2> /dev/null | \
        egrep '^ *[0-9.]*[MG]' | sort -n > /tmp/list
        egrep '^ *[0-9.]*M' /tmp/list
        egrep '^ *[0-9.]*G' /tmp/list
        rm -rf /tmp/list
}
# Usage: up <Number of directories>. Blank for up one dir.
up() {
    local d=""
    limit=$1
    for ((i=1; i <= limit; i++)); do
        d=$d/..
    done
    d=$(echo $d | sed 's/^\///')
    if [ -z "$d" ]; then
        d=..
    fi
    cd $d
}
# Search inside files for a string
# Usage: search <regex string>
search () {
    grep -r "$1" | fzf
}
# Search for a file by its name
# Usage: ff <filename> (optional) <max depth>
ff() { #find file
  if [ -z "${2}" ]; then
    find . -type f -iname "*${1}*"
  else
    find . -type f -maxdepth "${2}" -iname "*${1}*"
  fi
}
# Search for a file by its name and edit it
# Usage: vf <filename> (optional) <max depth>
vf() {  vim "$(ff "$@" | fzf)"; }
#https://unix.stackexchange.com/questions/144029/command-to-determine-ports-of-a-device-like-dev-ttyusb0
function list_usb() {
  for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
      (
          syspath="${sysdevpath%/dev}"
          devname="$(udevadm info -q name -p $syspath)"
          [[ "$devname" == "bus/"* ]] && exit
          eval "$(udevadm info -q property --export -p $syspath)"
          [[ -z "$ID_SERIAL" ]] && exit
          echo "$ID_SERIAL" | tr '_' ' '
      )
  done
}
