Как я считаю все файлы, которые начинаются с букв от до g?

< /dev/null используется для мгновенной отправки EOF в программу, так, чтобы это не ожидало входа (/dev/null, пустое устройство, специальный файл, который отбрасывает все данные, записанные в него, но сообщает, что операция записи, за которой следуют, и, не предоставляет данных никакому процессу, который читает из него, приведя к EOF сразу). & специальный тип разделителя команды, привыкшего к фону предыдущий процесс.

Не зная называемую программу, я непосредственно не знаю, почему она требуется выполнить его таким образом.

3
09.11.2012, 01:14
5 ответов
LC_ALL=C
set -- [a-gA-G]*
if [ "$1" = '[a-gA-G]*' ]; then
  echo 0
else
  echo "$#"
fi          
7
27.01.2020, 21:08
  • 1
    +1 для использования оболочки внутренние команды только; o) –  jippie 08.11.2012, 23:41
  • 2
    Вы всех людей, возможно, упомянули zsh: print -lr [A-Ga-g]*(N) (или print -lr (#i)[a-g]*(N) если Вы хотите быть необычными). –  Gilles 'SO- stop being evil' 09.11.2012, 01:18
  • 3
    @Gilles, Вы имеете в виду n=0;: (#i)[a-g]*(Ne:'((!++n))':) ? ;-) –  Stéphane Chazelas 09.11.2012, 08:26
  • 4
    @StephaneChazelas, ой, я так или иначе отбросил “количество”, когда я записал это. (a=((#i)[a-g]*(N)); echo $#a) меньше вводит (и менее загадочный). –  Gilles 'SO- stop being evil' 09.11.2012, 13:06
  • 5
    @Gilles, я собирался сказать, что это менее эффективно, поскольку это сортирует список (который можно отключить с newers версиями zsh, хотя), и хранит его в памяти, но на самом деле, это, кажется, быстрее, потому что по некоторым причинам шахта заставляет zsh делать, lstat (2) на каждом файле –  Stéphane Chazelas 09.11.2012, 13:53

Можно сделать это с короткой командой оболочки:

find / -name '[abcedfg]*' -print | wc -l

Вы будете видеть некоторые сообщения о как find не имеет разрешения прочитать некоторый каталог или другого, но Вы получите количество файлов, имена которых начинаются с тех 7 букв.

4
27.01.2020, 21:08
  • 1
    какая-либо причина указать [abcedfg] по сравнению только с [a-g]? –  amphibient 08.11.2012, 22:37
  • 2
    Просто привычка для меня. Те два шарика оболочки должны соответствовать тем же именам файлов, но я думаю, видя, что все символы в диапазоне более ясны, по крайней мере, для небольших чисел символов. –  Bruce Ediger 08.11.2012, 23:24
  • 3
    Обратите внимание, что файлы с символами новой строки в их пути будут несколько раз считаться. –  Stéphane Chazelas 08.11.2012, 23:39
  • 4
    @foampile, поведение значения диапазонов является иждивенцем локали. [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 и затем считает файлы

2
27.01.2020, 21:08

Реализация GNU ls команда (который Вы используете, так как Вы запускаете Linux) найдет все файлы в текущем каталоге, запускающемся с символа a-g.

ls --ignore='[!a-g]*'

Это говорит для игнорирования всех файлов, которые не запускаются с символа в диапазоне [a-g]. ! инвертирует фильтр. * указать

Следующий запуск вывод через wc -l считать строки.

Полная команда таким образом будет:

ls --ignore='[!a-g]*' | wc -l

Это решение не будет повторяться в подкаталоги.

2
27.01.2020, 21:08
  • 1
    я запускаю Linux и мой ls реализован BusyBox. Возможно, необходимо объяснить, почему Вы инвертируете шаблон, затем игнорирующий его вместо просто выполнения ls [a-g]* (Я принимаю для обработки случая 0 соответствий или шарика, расширяющегося в слишком много аргументов.) И поскольку @StephaneChazelas говорит в комментарии другому ответу, почему бы не добавить -d постараться не рекурсивно вызывать в каталоги? дата –  dubiousjim 09.11.2012, 19:34
  • 2
    @dubiousjim -d не помог бы здесь, поскольку ls не дают аргумента, таким образом, он принимает значение по умолчанию к текущему каталогу. С -d, это просто возвратилось бы"." –  Stéphane Chazelas 09.11.2012, 20:35
ls -1 [a-g]* | wc -l

Почему этому нравится это? Поскольку Вы, вероятно, хотите самый простой ответ; этот предполагает, что Вы не должны волноваться о не подсчете каталогов, ни поиске подкаталогов, ни прописных имен файлов..., и это - команда, которую я чаще всего использую.

1
27.01.2020, 21:08
  • 1
    1 не необходим, когда вывод не к терминалу (как канал или socketpair (ksh93) выше). Каков вред в добавлении-d опции, и заставьте его исправить? –  Stéphane Chazelas 09.11.2012, 14:17

Теги

Похожие вопросы