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*



This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org

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 Jun. 10th, 2025 12:41 pm
Powered by Dreamwidth Studios