ocehb: (Default)
[personal profile] ocehb

В 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*



Profile

ocehb: (Default)
ocehb

January 2021

S M T W T F S
     12
345 6789
10111213141516
17181920212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 7th, 2026 03:26 am
Powered by Dreamwidth Studios