Если у Вас есть GNU grep (всегда на Linux и Cygwin, иногда в другом месте), можно считать выходные строки от grep -o
: grep -o needle | wc -l
.
С Perl вот несколько способов, которыми я нахожу более изящными, чем Ваш (даже после того, как он фиксируется).
perl -lne 'END {print $c} map ++$c, /needle/g'
perl -lne 'END {print $c} $c += s/needle//g'
perl -lne 'END {print $c} ++$c while /needle/g'
Только с инструментами POSIX один подход, если это возможно, должен разделить вход на строки с единственным соответствием прежде, чем передать его grep. Например, если Вы ищете целые слова, затем сначала превращаете каждый несловесный символ в новую строку.
# equivalent to grep -ow 'needle' | wc -l
tr -c '[:alnum:]' '[\n*]' | grep -c '^needle$'
Иначе нет никакой стандартной команды, чтобы внести свою лепту обработки текста, таким образом, необходимо обратиться к sed (если Вы - мазохист), или awk.
awk '{while (match($0, /set/)) {++c; $0=substr($0, RSTART+RLENGTH)}}
END {print c}'
sed -n -e 's/set/\n&\n/g' -e 's/^/\n/' -e 's/$/\n/' \
-e 's/\n[^\n]*\n/\n/g' -e 's/^\n//' -e 's/\n$//' \
-e '/./p' | wc -l
Вот использование простого решения sed
и grep
, который работает на строки или даже регулярные выражения книгой, но перестал работать в нескольких угловых случаях с привязанными шаблонами (например, это находит два случаев ^needle
или \bneedle
в needleneedle
).
sed 's/needle/\n&\n/g' | grep -cx 'needle'
Обратите внимание, что в sed заменах выше, я использовал \n
означать новую строку. Это стандартно в части шаблона, но в тексте замены, для мобильности, новой строки обратной косой черты замены для \n
.
Вы попробовали
ls -U | head -4
Это должно пропустить сортировку, которая является, вероятно, почему ls
занимает много времени.
Если Ваша версия ls
имеет путь не в файлы вида, такой как -U
для GNU ls, используйте его. Без опции, ls
сначала считает все файлы, затем отсортирует имена, затем начать печатать.
Другая возможность состоит в том, чтобы работать find
, который печатает имена, поскольку это находит их.
find . -name . -o -prune | head
(обратите внимание на это с тех пор head
работает над строками, который предполагает, что имена файлов не содержат символы новой строки).
find
(в противоположность busybox или семейной реликвии find
или GNU ls -U
), кажется, что это читает целый каталог прежде, чем начать печатать.
– Stéphane Chazelas
14.05.2015, 19:11
Возможно, Вы нуждаетесь в инструменте кроме ls
?
Например, у Randal Schwartz есть запись в блоге об использовании perl
на больших каталогах, которые могут содержать некоторые подсказки при создании чего-то, что удовлетворяет Ваши потребности.
В сообщении в блоге Randal объясняет это оба ls
и find
попытайтесь читать во всех записях каталога прежде, чем распечатать любого, в то время как perl
решение, которое он предлагает, не делает.
perl
вероятно, использование readdir(3)
как ls
или find
. readdir(3)
на текущих версиях GNU/Linux, по крайней мере, звонит getdents()
системный вызов с большим количеством (который на самом деле обычно оптимизирует действия путем сокращения количества сделанных системных вызовов). Но в Вашем случае, если бы Вы хотите меньше файлов, похоже, что необходимо было бы обойти readdir
и используйте BSDs getdirentries(3)
или getdents(2)
системный вызов вместо этого.
– Stéphane Chazelas
14.05.2015, 19:35
Возможно, меньше лучше подходит для Ваших потребностей?
ls /usr/bin | less
Для меня это работает мгновенно над 5-летним ноутбуком с классическим жестким диском, но голова одинаково быстра.
Можно завершить less
преждевременно с q.
Я предполагаю, что Ваше предположение об источнике 1 задержки с является неправильным, но возможно зависит от Вашего аромата Unix или Вашей оболочки, меньше или главной команды.
На Linux, с GNU-ls,
ls -R /usr | less
начинает производить сразу для меня, в то время как целый вывод выполняет und, работающий - таким образом, он окончательно не закончен, прежде чем меньше запускается. Вы могли бы проверить, если у Вас есть постоянная задержка 1 с или возможно больше, в зависимости от вывода или нет.
Я предполагаю, что Ваша 1 задержка с имеет другую причину, возможно, жесткий диск засыпает и нуждается в пробуждении?
У Вас есть такая задержка очень немногих файлов также?
ls
результат. Я искал путь к самому ls для ограничения количества результатов.
– AndreDurao
24.01.2012, 13:40
Если производительность не является проблемой (как в вопросе, который был закрыт как дубликат этого), и вы хотите перечислить первые n файлов (в отличие от первых n строк вывода LS
) В списке не скрытых файлов отсортированы по имени файла, с ZSH
, вы можете использовать:
ls -ld -- *([1,4])
, чтобы переписать первые 4 файла. ZSH
все равно будет прочитать полное содержание каталога, хотя, даже если вы скажете это не сортировать с * (на [1,4])
(обратите внимание, что LS
также сортирует этот список).
$ cut -f 1,n filename
hará la tarea de obtener los primeros archivos n
. n
es el número de archivos que desea extraer. entonces el código completo será:
$ ls|cut -f 1,n file
ls -U
не обязательно читает весь каталог перед печатью. Попробоватьstrace -e getdents,write ls -U > /dev/null
в большом каталоге, например. – Stéphane Chazelas 14.05.2015, 18:58