![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
В zsh существуют параметры
REPLY
и reply
, они используются во многих местах,одно из применений для генерации имён файлов:
# print -l .cpan/build/*.yml(e*'reply=( $REPLY $REPLY:r )'*)
.cpan/build/CPAN-Perl-Releases-2.80-lfe2Rz
.cpan/build/CPAN-Perl-Releases-2.80-lfe2Rz.yml
.cpan/build/Module-CoreList-5.20160620-PAXn3d
.cpan/build/Module-CoreList-5.20160620-PAXn3d.yml
.cpan/build/Mojolicious-6.66-7pCOS0
.cpan/build/Mojolicious-6.66-7pCOS0.yml
.cpan/build/Test-Exception-LessClever-0.007-bkeuzK
.cpan/build/Test-Exception-LessClever-0.007-bkeuzK.yml
.cpan/build/Time-HiRes-1.9735-ss7ApY
.cpan/build/Time-HiRes-1.9735-ss7ApY.yml
Расшифровка:
.cpan/build/*.yml
— стандартный glob, выбираем все файлы из.cpan/build/
по маске*.yml
(e*...*)
— параметр (квалификатор?) генерации имен файлов: то, что стоит между*
выполняется как zsh-script. Символ разделения можно выбирать призвольный, главное, чтобы он не встречался внутри кода, результат может быть непредсказуем. Рекомендуется экранировать содержимое с помощью'
.$REPLY
— переменная zsh, в данном случае содержит имя файла, выбранного в процессе глоббинга, с ним можно производить стандартные манипуляции:print .zsh(e*'print -nPu2 "%B$REPLY%b"'*)
илиprint .zsh(e*'REPLY=lala$REPLY'*)
reply
— тоже переменная zsh, но представляет собой массив, который будет возвращён, если он не пустой, иначе будет возвращено значение переменнойreply
:print .zsh(e*'REPLY=$REPLY.foobar; reply=( foo bar )'*)
- Замечание: так как это генерация файла, то исходный файл должен существовать, иначе будет сгенерирована ошибка
reply=( $REPLY $REPLY:r )
— из одного файла (в$REPLY
) генерируем два: один изначальный, второй полученный из первого удалением самого правого расширения (foo.bar → foo
), присваиваем егоreply
, и автоматом возвращаем этот массив.
Пример применения:
# rm -rf .cpan/build/*.yml(e*'reply=( $REPLY $REPLY:r )'*)
# ls -alF .cpan/build
total 44
drwxr-xr-x. 2 ocehb ocehb 28672 Jun 21 08:27 ./
drwxr-xr-x. 6 ocehb ocehb 4096 Jun 21 07:46 ../
-rw-r--r--. 1 ocehb ocehb 0 Jun 21 08:23 FOOBAR
Удалены все файлы *.yml и соответствуюшие им каталоги, файл FOOBAR остался.
Другой пример: удалить
.vmlinuz.hmac
-файлы, которые не соответствуют текущей версии ядра:
# UNAME_R=$( uname -r )
# rm -f /boot/.vmlinuz.hmac-*(e*'[[ $REPLY != *-$UNAME_R ]] && reply=( $REPLY )'*)
# ls -alF /boot
total 51302
dr-xr-xr-x. 5 root root 3072 Jun 21 08:39 ./
dr-xr-xr-x. 20 root root 4096 May 24 08:36 ../
drwxr-xr-x. 3 root root 1024 Nov 11 2010 efi/
drwxr-xr-x. 6 root root 1024 Jun 20 06:46 grub2/
drwx------. 2 root root 12288 Nov 11 2010 lost+found/
-rw-r--r--. 1 root root 164 Jun 8 21:29 .vmlinuz.hmac-4.5.7-200.fc23.i686
-rw-------. 1 root root 2519986 Jun 8 21:35 System.map-4.5.7-200.fc23.i686
-rw-r--r--. 1 root root 174288 Jun 8 21:35 config-4.5.7-200.fc23.i686
-rw-------. 1 root root 24124124 Jul 3 2013 initramfs-0-rescue-8d888ec4a0ab89ef2b31ecb000000008.img
-rw-------. 1 root root 14373271 Jun 20 06:34 initramfs-4.5.7-200.fc23.i686.img
-rw-r--r--. 1 root root 217783 Nov 13 2015 initrd-plymouth.img
-rwxr-xr-x. 1 root root 4941392 Jul 3 2013 vmlinuz-0-rescue-8d888ec4a0ab89ef2b31ecb000000008*
-rwxr-xr-x. 1 root root 6144544 Jun 8 21:35 vmlinuz-4.5.7-200.fc23.i686*