drBatty писал(а): ↑17.04.2012 10:14дело не в for, а в звёздочке:
1. она _может_ раскрыться не полностью, и на практике лично я такое наблюдал.
2. перед звёздочкой надо по уму проверить, не является-ли каталог пустым. Иначе в этой вполне штатной ситуации звёздочка не раскроется, и если она в КС, то сама звёздочка и передастся, а если она в for in *, то передастся пустая строка.
$
for f in *; do echo "i='$i'"; done i='' echo * *
3. поведение звёздочки почти не регулируемое. В частности она не отличает каталоги от файлов, не понимает, что симлинк это не обычный файл, и не видит скрытых файлов.
4. Звёздочка выдаёт не просто список файлов, а отсортированный список. Практически всегда это не нужно. Какой смысл тратить ресурсы на ненужную сортировку? (если каталог большой, то ресурсы не малые, ибо сортировать надо "на месте", а это O(N*log(N)) по времени, и ещё O(N) по памяти).
вот как раз с find никаких проблем и не будет: есть там опции -P, -L, и -H, которые позволяют мне обрабатывать симлинки именно так, как _мне_ это нужно. А не как звёздочка, которая (не)раскрывается так, как _она_ хочет.
ну не нравится такое поведение - поменяйте. К вашему распоряжению кроме упомянутых H,L,P есть ещё xtype & follow. Для звёздочки всего этого нет, и не будет...
Что интересно, всё это есть в zsh:
1. Если вы имеете ввиду файлы, начинающиеся с точки, то на это есть GLOB_DOTS, временно устанавливаемая с помощью (D): * выведет все файлы, не начинающиеся с точки, *(D) — вообще все.
2. Если использовать настройку NULL_GLOBS, то в пустом каталоге она раскроется в пустой список (по умолчанию это ошибка, предотвращающая запуск команды вообще, хотя можно сделать и как в bash). Локально это устанавливается с помощью (N), комбинация с (D) позволяется: *(ND).
3. Тоже есть методы обхода: про скрытые файлы я сказал в п. 1., ограничится только каталогами можно с помощью (/), но если нужно сделать что‐то вроде «каталоги перед файлами», придётся иметь дело с (oe)/(o+) и shell код внутри/свою функцию выше.
4. Сортировка убирается с помощью (oN).
5. Чтобы сделать -L, придётся привлекать (e)/(+) и писать shell код внутри/свою функцию выше, но это возможно.
6. -xtype/-follow соответствует применению (-) для всех последующих квалификаторов.
zsh здесь медленнее, да. Но со звёздочкой можно сделать то, что find и не снилось, хотя кое‐где с find то же самое будет удобнее.
Так что прежде, чем говорить «нет, и не будет», попробуйте zsh. *(D/) набирается гораздо быстрее, чем find -type d, используется легче, а на сколько мс это будет медленнее отрабатывать на моих задачах без разницы.