< /dev/null
используется для мгновенной отправки EOF в программу, так, чтобы это не ожидало входа (/dev/null
, пустое устройство, специальный файл, который отбрасывает все данные, записанные в него, но сообщает, что операция записи, за которой следуют, и, не предоставляет данных никакому процессу, который читает из него, приведя к EOF сразу). &
специальный тип разделителя команды, привыкшего к фону предыдущий процесс.
Не зная называемую программу, я непосредственно не знаю, почему она требуется выполнить его таким образом.
LC_ALL=C
set -- [a-gA-G]*
if [ "$1" = '[a-gA-G]*' ]; then
echo 0
else
echo "$#"
fi
Можно сделать это с короткой командой оболочки:
find / -name '[abcedfg]*' -print | wc -l
Вы будете видеть некоторые сообщения о как find
не имеет разрешения прочитать некоторый каталог или другого, но Вы получите количество файлов, имена которых начинаются с тех 7 букв.
[a-g]
будет соответствовать é в большинстве локалей неASCII вопреки [abcdefg]
– Stéphane Chazelas
08.11.2012, 23:45
Находка GNU может сделать это для Вас:
find ./ -type f -maxdepth 1 -iname "[a-g]*" 2> /dev/null | wc -l
это находит все файлы (не каталоги) под ./
но не роет ни в какие дальнейшие каталоги и соответствует имени (нечувствительному к регистру) из файла, начинающегося "a-g", перенаправляет все ошибки к /dev/null
и затем считает файлы
Реализация GNU ls
команда (который Вы используете, так как Вы запускаете Linux) найдет все файлы в текущем каталоге, запускающемся с символа a-g.
ls --ignore='[!a-g]*'
Это говорит для игнорирования всех файлов, которые не запускаются с символа в диапазоне [a-g]
. !
инвертирует фильтр. *
указать
Следующий запуск вывод через wc -l
считать строки.
Полная команда таким образом будет:
ls --ignore='[!a-g]*' | wc -l
Это решение не будет повторяться в подкаталоги.
ls
реализован BusyBox. Возможно, необходимо объяснить, почему Вы инвертируете шаблон, затем игнорирующий его вместо просто выполнения ls [a-g]*
(Я принимаю для обработки случая 0 соответствий или шарика, расширяющегося в слишком много аргументов.) И поскольку @StephaneChazelas говорит в комментарии другому ответу, почему бы не добавить -d
постараться не рекурсивно вызывать в каталоги? дата
– dubiousjim
09.11.2012, 19:34
-d
не помог бы здесь, поскольку ls не дают аргумента, таким образом, он принимает значение по умолчанию к текущему каталогу. С -d
, это просто возвратилось бы"."
– Stéphane Chazelas
09.11.2012, 20:35
ls -1 [a-g]* | wc -l
Почему этому нравится это? Поскольку Вы, вероятно, хотите самый простой ответ; этот предполагает, что Вы не должны волноваться о не подсчете каталогов, ни поиске подкаталогов, ни прописных имен файлов..., и это - команда, которую я чаще всего использую.
print -lr [A-Ga-g]*(N)
(илиprint -lr (#i)[a-g]*(N)
если Вы хотите быть необычными). – Gilles 'SO- stop being evil' 09.11.2012, 01:18n=0;: (#i)[a-g]*(Ne:'((!++n))':)
? ;-) – Stéphane Chazelas 09.11.2012, 08:26(a=((#i)[a-g]*(N)); echo $#a)
меньше вводит (и менее загадочный). – Gilles 'SO- stop being evil' 09.11.2012, 13:06