С zsh
,ты можешь сделать
set -o extendedglob # for ^ and (#i)
printf '%s\n' **/*(D/F^e'[()(($#)) $REPLY/^(#i)(*.tmp|desktop.ini|Thumbs.db|.picasa.ini)(ND)]')
Список каталогов, содержащих только записи, соответствующие (*.tmp|desktop.ini|Thumbs.db|.picasa.ini)
без учета регистра.
**/
:рекурсивный глобус (любой уровень подкаталогов)*(qualifier)
:glob (здесь *
соответствие любому файлу )с квалификаторами (для соответствия другим критериям, кроме имени ). D
:включить dotglob
для этого шара (включить скрытые файлы и просмотреть скрытые каталоги ). /
:выбирать только файлы типа директорияF
:только те F
пустые (, которые содержат хотя бы одну запись ). Удалите, если вы также хотите перечислить пустые каталоги. ^
:отрицание следующих квалификаторов e'[code]'
:квалификатор оценки e
:выбирает файлы, для которых код не (с предыдущим^
)возвращает true. () {code} args
:анонимная функция. Здесь код (($#))
представляет собой арифметическое выражение в стиле ksh -, которое здесь оценивается как true
, если $#
не равно -нулю ($#
, являющемуся количеством аргументов анонимной функции ). $REPLY/^(#i)(*.tmp|desktop.ini|Thumbs.db|.picasa.ini)(ND)
составляет аргументы этой встроенной функции. Вот еще один шар:$REPLY
:внутри e'[code]'
— это путь к рассматриваемому в данный момент файлу. ^
:отрицание. (#i)
:включить нечувствительное к регистру сопоставление для остальной части шаблона. (*.tmp|desktop.ini|Thumbs.db|.picasa.ini)
:любой из тех, поэтому с отрицанием ни один из них. (ND)
:еще один квалификатор глобуса. N
дляnullglob
(глобус расширяется до нуля, если совпадений нет, поэтому (($#))
снова становится ложным ), D
для dotglob
. Здесь, в качестве оптимизации, мы могли бы также добавитьoN
(к N
или o
к списку соответствующих файлов )и [1]
, чтобы выбрать только первый, поскольку нам не нужно знать, сколько их есть, только есть ли они вообще. Чтобы сделать текст более разборчивым,мы могли бы использовать функцию:
set -o extendedglob
has_useful_entries()
()(($#)) ${1-$REPLY}/^(#i)(*.tmp|desktop.ini|Thumbs.db|.picasa.ini)(NDoN[1])
printf '%s\n' **/*(D/F^+has_useful_entries)