>> find tst -type f
> Да. Но find смотрит либо по всей файловой системе, что часто долго. ...
find [-H] [-L] [-P] [path...] [expression]
...
If no paths are given, the current directory is used.
...
сырцы конечно не смотрел, но на нах ему path по Вашему? чтобы от корня искать что ли?
> ls и прочие срабатывают гораздо быстрее. Либо, может быть, надо делать
ls несомненно быстрее, но ограничен по возможностям выбора файлов относительно find (собственно поэтому и быстрее).
> свою обвязку которая будет разбирать шаблон, чтобы установить для find нужные
> min и max глубину.
дык установка min max глубины поиска - это святое для find если они заранее известны.
только не понятно зачем нужна специальная обвязка для определения глубины поиска - это бред.
> Использование "find ... -name ..." приводит к тем же вопросам о пробеле
> в имени и кавычках, что и для ls, echo и т.п.
не совсем понимаю о каких проблемах Вы говорите. Что - экранирование символов не работает? Тем более что можно не пользовать name find-a, а grep-у его вывод отдать ...
можно пример задачи?
> P.S. Про обе звёздочки я выше неправильное написал. В конкретном примере никогда
> мой шаблон не развернётся как три файла, т.к. в шаблоне чётко
> задаётся глубина в дереве каталогов, а "верхний" файл лежит в каталоге
> "другой глубины".
а вот теперь я понял кажется задачу - надо вывести файлы ТОЛЬКО из каталога той глубины, что задана маской со звездочками. теперь понятно про глубину поиска..
[root@local eth1]# echo 'zz/qq/*/*/*'|awk '{ gsub(/[^*]/, ""); printf("%s\n", $0) }'|wc -m
4
[root@local eth1]# echo 'zz/qq/*/*/*'|sed s/[^*]//g|wc -c
4
[root@local eth1]# echo "123"|wc -c
4
не совсем понятно почему всегда 4, хотя по идее должно быть 3... м/б wc перевод строки считает..
ну тогда как-то так:
[root@local 111]# cat ./t
#!/bin/bash
m='tst/*/*/*'
echo "mask=$m"
p=`echo "$m"|sed 's/\/\*//g'`
echo "path=$p"
d=`echo "$m"|sed s/[^*]//g|wc -c`
d=$(($d-1))
echo "depth=$d"
find tst -mindepth $d -maxdepth $d -type f
[root@local 111]# ./t
mask=tst/*/*/*
path=tst
depth=3
tst/aaa bbb/111/example1.txt
tst/aaa bbb/222/example2.txt
[root@local 111]#
>[оверквотинг удален]
>
> tar_cmd="tar zcpvh -f \"/tmp/tar.tar\" --directory \"/\" "
> IFS_old=$IFS ; IFS=
> for val in ${files_to_tar} ; do
> tar_cmd="${tar_cmd} \"${val}\""
> done
> ls -1 ${files_to_tar}
> IFS=$IFS_old
> /bin/bash -c "${tar_cmd}"
>
PS
видимо правильней для wc все же опцию -m вместо -c в данном случае использовать