この記事は『CRESCO Advent Calendar 2021』 2日目の記事です。

 

技研のまつけんです。

UNIX/Linuxでbashを使っている場合、起動時に~/.bashrcが実行されます。そこに

if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi

という記述があれば、~/.bash_aliasesが実行されます。今回は、私のそれ (ちょっとした便利ツール的なaliasたち) を紹介します (一部は、既に以前の記事で紹介済みなので、それらについては今回は割愛します)。なお、aliasと一緒にfunctionも記述されていますが、そこは気にせず運用しています。

定番の確認関連

まずは、定番の確認系です。cp/mvは上書きは上書きの確認、rmは削除の確認をするのをデフォルトにし、確認不要のときだけ-fを付けるようにします。

alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -i'

ディレクトリ関連

cdコマンド用です。複数階層を戻りたい場合に便利です。最初のcd.は一見無意味ですが、カレントディレクトリを他のターミナルなどから削除・作り直しされたときに使います。

alias cd.='cd ./'
alias cd..='cd ../'
alias cd...='cd ../../'

ちなみに、10階層分までのaliasをループで作る方法もあります。

for N in `seq 10`
do
S='.'
D=''
for I in `seq $N`
do
S=$S.
D=$D../
done
alias cd$S="cd $D"
done

続いて、ディレクトリ操作です。再帰的に書き込み禁止にしたり、書き込み可能にします。前者は全ユーザの書き込みを禁止(a-w)しますが、後者は所有者だけが対象 (u+w) です。

alias lockdir='chmod a-w -R'
alias unlockdir='chmod u+w -R'

検索関連

以前の記事でalljpg (.jpgと.jpegを検索) を紹介しましたが、それの応用形です。

alias  allpng='find -type f -iname "*.png"'
alias allmovie='find -type f -iname "*.mov" -or -iname "*.avi" -or -iname "*.mp4" -or -iname "*.wmv"'
alias allimage='find -type f -iname "*.jpg" -or -iname "*.jpeg" -or -iname "*.png" -or -iname "*.bmp"'
alias allpy='find -type f -iname \*.py'
alias allnb='find -type f -iname \*.ipynb'
alias allcp='find -type f -iname \*.cpp'
alias allc='find -type f -iname \*.c'
alias allh='find -type f -iname \*.h'
alias allch='find -type f -iname \*.[ch]'
alias allcph='find -type f -iname \*.cpp -or -iname \*.h'
alias allccph='find -type f -iname \*.cpp -or -iname \*.[ch]'

必要なら、お好みで| sortを追加するか、allxx | sortで使ってください。また、こちらは検索した上でgrepするものです。qは以前の記事で紹介した「行頭と行末に’を付ける」です。

alias allpygrep='allpy | q | xargs grep'
alias allnbgrep='allnb | q | xargs grep'
alias allcpgrep='allcp | q | xargs grep'
alias allcgrep='allc | q | xargs grep'
alias allhgrep='allh | q | xargs grep'
alias allchgrep='allch | q | xargs grep'
alias allcphgrep='allcph | q | xargs grep'
alias allccphgrep='allccph | q | xargs grep'

なお、こちらのfind_by_extを使えば、allmovieはfind_by_ext mov avi mp4 wmvと記述できます。

function find_by_ext() {
CMD='find -type f'
for E in $@
do
CMD=$CMD" -iname \"*.$E\" -or"
done
echo $CMD | sed -e 's# -or$##' | bash
}

文字列操作

CSV/TSVファイルなどを「cut -d , -f 列番号」などで処理するときなどに使う文字列操作です。

alias zs="sed -e 's#^0\+0#0#' -e 's#^0\([^0]\)#\1#'" # zero suppress
alias comma='sed \
-e "s#\(^[0-9]\+\)\([0-9]\{3\}[ \t]\)#\1,\2#g" \
-e "s#\(^[0-9]\+\)\([0-9]\{3\}\$\)#\1,\2#g" \
-e "s#\([ \t][0-9]\+\)\([0-9]\{3\}[ \t]\)#\1,\2#g" \
-e "s#\([ \t][0-9]\+\)\([0-9]\{3\}[ \t]\)#\1,\2#g" \
-e "s#\([ \t][0-9]\+\)\([0-9]\{3\}\$\)#\1,\2#g" \
-e "s#\(^[0-9]\+\)\([0-9]\{3\},\)#\1,\2#g" \
-e "s#\(^[0-9]\+\)\([0-9]\{3\},\)#\1,\2#g" \
-e "s#\(^[0-9]\+\)\([0-9]\{3\},\)#\1,\2#g" \
-e "s#\(^[0-9]\+\)\([0-9]\{3\},\)#\1,\2#g" \
-e "s#\([ \t][0-9]\+\)\([0-9]\{3\},\)#\1,\2#g" \
-e "s#\([ \t][0-9]\+\)\([0-9]\{3\},\)#\1,\2#g" \
-e "s#\([ \t][0-9]\+\)\([0-9]\{3\},\)#\1,\2#g" \
-e "s#\([ \t][0-9]\+\)\([0-9]\{3\},\)#\1,\2#g"'

実行結果:

$ echo 0000 | zs
0
$ echo 0000123 | zs
123
$ echo 000.0000123 | zs
.0000123
$ echo 123456789 | comma
123,456,789
$ echo 1234567890123456789 | comma
1234,567,890,123,456,789
$ echo '123456 7890 1234567890123456789' | comma
123,456 7,890 1234,567,890,123,456,789
$ df | grep tmpfs | comma
tmpfs 8,215,424 2,068 8,213,356 1% /run
tmpfs 41,077,116 220 41,076,896 1% /dev/shm
tmpfs 5,120 0 5,120 0% /run/lock
tmpfs 41,077,116 0 41,077,116 0% /sys/fs/cgroup
tmpfs 8,215,420 0 8,215,420 0% /run/user/1005
tmpfs 8,215,420 0 8,215,420 0% /run/user/1004

コンマは18桁まで対応します。小数の先頭のゼロを残すかどうかは好みが分かれるところですね (-e ‘s#^.#0.#’を追加すれば残せます)。

こちらは、スクリーンサイズ (使用中のターミナルのウィンドウの横幅) に合わせてcutするものです。各行が長いテキストファイルなどを狭いウィンドウで見るときに、例えば、cat /etc/passwd | cutscrのように使います。

alias cutscr='cut -c -`tput cols`'

プロセス操作関連

jupyterのプロセスを纏めて落とすために作りました。

function getpids() {
echo `ps x | grep $1 | awk '{print $1}'`
}
alias psjupyter='getpids jupyter'
alias killjupyter='kill `psjupyter`'

Subversion関連

割とタイプ量が多いので。

alias up='svn up'
alias cu='svn cleanup'
alias re='svn revert -R'

Cygwin用

いつも、hostsファイルの場所を忘れてしまうので。

alias vihosts='vi /cygdrive/c/Windows/System32/drivers/etc/hosts'

まとめ

以上が、現在の私の.bash_aliasesになります。よろしければ、使ってみてください。今後、アップデートなどがありましたら、また記事にしたいと思います。