Created
September 19, 2012 23:07
-
-
Save bobbydavid/3752931 to your computer and use it in GitHub Desktop.
bash: give yourself useful recent directories with `cd` and `d` commands
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# | |
# Change directories, but with pushd functionality. | |
# | |
# 1) change to given directory. | |
# 2) add that directory to the stack. | |
# 3) delete any duplicates of it on the stack. | |
# 4) delete stack above $MAX_DIR_STACK_SIZE | |
# | |
# Find full path for destination directory. | |
if [ $# -eq 0 ]; then | |
DIR="$HOME" | |
elif [ $# -gt 1 ]; then | |
echo "cd $@: TOO MANY ARGUMENTS ARGGHHH" >&2 | |
return 1 | |
elif [ "$1" = ".." ]; then | |
DIR=`realpath ..` | |
elif [ "$1" = "-" ]; then | |
DIR=`realpath ~-` | |
else | |
DIR=`realpath "$1"` | |
fi | |
# Push directory. | |
pushd $DIR >/dev/null || return $? | |
# Remove duplicates. | |
EXISTING=`dirs -l -v | grep " ${PWD}\$" | egrep -o "^\s*[1-9][0-9]*" | sort -nr` | |
for NUM in $EXISTING; do | |
NUM=`echo "$NUM" | tr -d ' '` | |
popd -n +$NUM >/dev/null || return $? | |
done | |
# Truncate stack, if necessary. | |
if [ "$MAX_DIR_STACK_SIZE" ]; then | |
COUNT=`dirs -l -v -0 | awk '{print $1}'` | |
while [ "$COUNT" -gt "$MAX_DIR_STACK_SIZE" ]; do | |
popd -n -0 >/dev/null || return $? | |
COUNT=$(( $COUNT - 1 )) | |
done | |
fi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
dirs -v | awk -F" " ' | |
BEGIN { | |
OFS=" " | |
} | |
{ | |
w='`tput cols`' | |
xtra=length($0) - w | |
if (xtra > 0) { | |
plen = length($2) | |
split($2,pieces,"/") | |
pcount = length(pieces) | |
postfix="/ ... /" pieces[pcount] | |
remaining = length($2) - xtra - length(postfix) | |
str = "" | |
for (i = 2; i < pcount; i++) { | |
remaining = remaining - length(pieces[i]) - 1 | |
if (remaining > 0) { | |
str = str "/" pieces[i] | |
} | |
} | |
$2=str postfix | |
} | |
print $0 | |
}' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Recommend to add aliases in `~/.bashrc` to use this scripts. For example: | |
alias cd='. ~/bin/cd-pushd.sh' | |
alias d='. ~/bin/dirs-good' | |
Causes, for example: | |
$ d 0 ~/bin | |
1 ~ | |
2 /srv/www/project/ ... /long-directory-name | |
3 /srv/www/project/ ... /long-directory-name-2 | |
4 /srv/www/project/ ... /long-directory-name-3 | |
which you can then switch to using tilde, e.g. | |
$ cd ~4 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment