rsyncバックアップスクリプトを使用しています(ここを参照:https://codereview.stackexchange.com/questions/29429/push-backup-script) 次のディレクトリが作成されます。
back-2015-07-02T21_18_01
zsh
それでは、コマンドライン()にあり、に/path/to/my/backup/back-2015-07-02T21_18_01/home/myuser/myfiles/somedir/subdir/
切り替えたいとしましょう/path/to/my/backup/back-2016-04-02T21_17_01/home/myuser/myfiles/somedir/subdir/
。
最速/最も良い方法は何ですかzsh
?私は主にzshメニュー補完機能を使用しているので、メニュータブ補完機能を使用して別の日付を選択できますが、現在のサブディレクトリは維持したいと思います(他のバックアップ日付でのみ可能です)。
答え1
あるディレクトリコンポーネントを別のディレクトリコンポーネントに置き換える1つの方法zsh
は、2つのパラメータバージョンを使用することですcd
。
cd old new
これはnew
最初の部分文字列の一致を置き換えold
、ディレクトリを結果パスに変更しようとします。たとえば、
% pwd
/path/to/my/backup/back-2015-07-02T21_18_01/home/myuser/myfiles/somedir/subdir/
% cd "5-07-02T21_18_01" "6-04-02T21_17_01"
/path/to/my/backup/back-2016-04-02T21_17_01/home/myuser/myfiles/somedir/subdir/
% pwd
/path/to/my/backup/back-2016-04-02T21_17_01/home/myuser/myfiles/somedir/subdir/
検索と置換は完全に文字列レベルで行われ、置換は常に最初の一致でのみ行われます。したがって、存在する場合、/foo/foo/foo/foo
ランタイムは実際に存在するかどうかにかかわらず、cd foo bar
常にディレクトリをに変更しようとします。たとえ存在しても、そのような代替物を探すことはないだろう。/bar/foo/foo/foo
/foo/foo/bar/foo
2番目の引数の補完機能はで提供されていますが、1番目の引数compinit
は少なくともデフォルトの補完設定を使用して入力する必要があります。compinit
何らかの理由で有効になっていない場合は、実行して追加することautoload -U compinit; compinit
で~/.zshrc
変更できます。
ノート:文字列のcd
新しい文字をサポートします。つまり、を実行して切り替えることができます。しかし、この場合は完成しないようですので、2番目の引数も直接入力する必要があります。/
old
/a/b/c/d
/x/y/z/c/d
cd a/b x/y/z
答え2
私は実用的で好きでzsh完成を書くことは現在の技術範囲を超えているので、select
zsh(とbashの)メニューシステムを使って特別な目的の機能を書いています。
cdd(){
typeset dir
typeset -a dirs
if [[ $PWD =~ ^(.*)(/back-[0-9-]+T[0-9_]+/)(.*)$ ]]
then for dir in "$match[1]"/*/"$match[3]"
do [ "$dir" != "$PWD" -a -d "$dir" ] && dirs+=("$dir")
done
select dir in "$dirs[@]"
do echo "$dir"
cd "$dir"
break
done
else echo "no date in $PWD"
fi
}
これは現在のディレクトリを日付パターンを使用してディレクトリを囲む3つの部分に分割し、globsに置き換えます*
。結果のリストはzshで提供されており、1) ... 2) ...
1または2を入力してディレクトリに移動できるスタイルメニューがあります。