Попробуйте это:
find . -maxdepth 1 -not -name \. -exec rm -rf \{\} ;
Лучший способ просмотреть документацию по 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
).
Существует универсальное решение, которое не полагается на башизм: 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%
, что определенно не то, что вам нужно.