То, что делает это zsh решение “списка аргументов, слишком длинно”, делают?

Попробуйте это:

find . -maxdepth 1 -not -name \. -exec rm -rf \{\} ;
6
13.04.2017, 15:36
2 ответа

Лучший способ просмотреть документацию по zsh - использовать info .

Если вы запустите info zsh , вы можете использовать index (вспомните индекс book ), чтобы найти раздел, описывающий ] zmodload команда.

Нажмите i , затем введите zmo и нажмите Tab . Вы сразу попадете во встроенное описание zmodload , которое расскажет вам все об этом.

Короче говоря, zmodload -F загружает модуль (если не загружен) и включает только указанные функции из этого модуля.

С помощью -m мы включили функции, которые m захватывают шаблон, здесь b: zf _ * . b: для встроенного, поэтому приведенная выше команда загружает модуль zsh / files (см. info -f zsh -n 'Модуль zsh / files,' для подробностей об этом) и включает только встроенные команды, имя которых начинается с zf_ .

zmodload -F zsh/files

загружает модуль, но не включает никаких функций:

$ zmodload -FlL zsh/files
zmodload -F zsh/files -b:chgrp -b:chown -b:ln -b:mkdir -b:mv -b:rm -b:rmdir -b:sync -b:zf_chgrp -b:zf_chown -b:zf_ln -b:zf_mkdir -b:zf_mv -b:zf_rm -b:zf_rmdir -b:zf_sync

перечисляет функции этого модуля, указывая, какие из них включены в данный момент (на данный момент нет). Вы заметите, что есть встроенные функции mv и zf_mv .

$ zmodload -mF zsh/files 'b:zf_*'
$ zmodload -FlL zsh/files
zmodload -F zsh/files -b:chgrp -b:chown -b:ln -b:mkdir -b:mv -b:rm -b:rmdir -b:sync +b:zf_chgrp +b:zf_chown +b:zf_ln +b:zf_mkdir +b:zf_mv +b:zf_rm +b:zf_rmdir +b:zf_sync

Вы заметите, что встроенная функция zf_mv была включена, но не mv (то же самое для других встроенных функций). Это означает, что эти встроенные версии системных команд были включены, но без переопределения системной:

$ type zf_mv
zf_mv is a shell builtin
$ type mv
mv is /bin/mv

Теперь, когда у вас есть встроенная mv , как zf_mv , не mv , вы можете:

zf_mv -- ^*.(jpg|png|bmp) targetdir/

Поскольку zf_mv является встроенным, системного вызова execve () не будет, поэтому вы не попадете в ] Слишком много аргументов limit, связанных с ним.

Конечно, вы также можете:

zmodload zsh/files # without -F, all the features are enabled
mv -- ^*.(jpg|png|bmp) targetdir/

Но будьте осторожны, это заменяет системный mv на встроенный эквивалент zsh .

Чтобы преодолеть ошибку E2BIG execve () ( Слишком много аргументов при выполнении внешней команды), zsh также предоставляет функция zargs .

Вы запускаете:

autoload zargs # in ~/.zshrc if you use it often

Чтобы пометить его для автозагрузки.

Затем вы можете использовать:

zargs -- ^*.(jpg|png|bmp) -- mv -t targetdir/

(здесь предполагается, что GNU mv для параметра -t ). zargs выполнит столько команд mv , сколько необходимо, чтобы избежать E2BIG (как и xargs ).

12
27.01.2020, 20:24

Существует универсальное решение, которое не полагается на башизм: xargs .

xargs считывает поток аргументов из stdin и затем передает их произвольной указанной утилите. В вашем случае командная строка должна выглядеть так:

# find -E /source/dir -iregex ".*\.(jpg|png|bmp)" | xargz -n 1 -J % mv % /target/dir

Здесь -E означает, что find использовал современные регулярные выражения (для | альтернатив), -n 1 означает, что входящий поток будет разделен на отдельные аргументы, -J% означает, что каждый аргумент будет заменен при следующем появлении символа % .

-J% необходимо, потому что xargs по умолчанию добавляет аргумент в конец дочерней команды. Отсутствие -J% эквивалентно xargs -n 1 -J% mv / target / dir% , что определенно не то, что вам нужно.

-2
27.01.2020, 20:24

Теги

Похожие вопросы