Intereting Posts
Настройка пользователя для доступа sftp в подкаталог другого домашнего каталога пользователей Использование Putty / plink для scp для именованного канала Установка разрешений для определенных программ для запуска в качестве гостевого Использование fallocate и mkfs.ext4 может превышать доступное дисковое пространство Есть ли способ предсказать назначение идентификатора PulseAudio Sink ID? Проблема с установкой torcs, ошибка с openal Рекомендуемый Linux Distro для сервера MMO Linux найдет протокол WiFi Networks (a / b / g / n) всех доступных точек доступа Игнорирование зависимостей при установке с помощью yum (Scientific Linux) Избегайте расширения обратной косой черты с эхом в тире Где «последний» хранит имена хостов пользователя? Принимая аргументы оболочки и обновляя значения получить части строки, используя сценарий оболочки Настройка портативной среды разработки Каким будет пакет RHEL, соответствующий встроенному в Ubuntu?

Лучший способ просмотра различных версий резервной копии каталога

Я использую сценарий резервного копирования rsync (см. Здесь: https://codereview.stackexchange.com/questions/29429/push-backup-script ), который создает каталоги, такие как

back-2015-07-02T21_18_01

Теперь предположим, что я в командной строке ( zsh ) on /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-меню, так что было бы здорово, если бы я мог просто выбрать через закладку меню другую дату, но сохранить текущий subdir (только с другой даты резервного копирования).

Одним из способов обмена одним компонентом каталога для другого в zsh является версия с двумя аргументами 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 , даже если она существует.

Завершение второго аргумента предоставляется compinit , но вы должны ввести первый аргумент (по крайней мере, с настройками завершения по умолчанию). Если compinit – по какой-то причине – не включается, вы можете изменить это, запустив autoload -U compinit; compinit autoload -U compinit; compinit (и добавив его к вашему ~/.zshrc ).

Примечание : cd поддерживает / символы в old и новой строках, то есть вы можете переключиться с /a/b/c/d на /x/y/z/c/d , запустив cd a/bx/y/z . Но похоже, что завершение не работает в этом случае, поэтому вам также нужно ввести второй аргумент самостоятельно.

Мне нравится быть прагматичным, и поскольку написание 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 } 

Это разделяет текущий каталог на три части по каталогу с шаблоном даты, а затем заменяет его с помощью glob * . Полученный список представлен zsh с меню стиля 1) ... 2) ... котором вы просто вводите 1 или 2 в cd в этот каталог.