Как я ограничиваю количество файлов, распечатанных ls?

Если у Вас есть 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.

95
04.04.2016, 14:48
7 ответов

Вы попробовали

ls -U | head -4

Это должно пропустить сортировку, которая является, вероятно, почему ls занимает много времени.

https://stackoverflow.com/questions/40193/quick-ls-command

117
27.01.2020, 19:30
  • 1
    "ls-U" все еще читает весь каталог перед печатью... Я думаю, что запишу маленький сценарий для ограничения файлов, но что ссылка вопроса является хорошим материалом чтения. Спасибо niko. –  AndreDurao 27.09.2011, 19:43
  • 2
    @AndreDurao, GNU ls -U не обязательно читает весь каталог перед печатью. Попробовать strace -e getdents,write ls -U > /dev/null в большом каталоге, например. –  Stéphane Chazelas 14.05.2015, 18:58
  • 3
    Просто примечание: если Вы хотите выполниться, strace на OSX ищут dtrace, команда strace является утилитой –  AndreDurao 28.04.2017, 17:28

Если Ваша версия ls имеет путь не в файлы вида, такой как -U для GNU ls, используйте его. Без опции, ls сначала считает все файлы, затем отсортирует имена, затем начать печатать.

Другая возможность состоит в том, чтобы работать find, который печатает имена, поскольку это находит их.

find . -name . -o -prune | head

(обратите внимание на это с тех пор head работает над строками, который предполагает, что имена файлов не содержат символы новой строки).

12
27.01.2020, 19:30
  • 1
    Отметьте это в случае GNU find (в противоположность busybox или семейной реликвии find или GNU ls -U), кажется, что это читает целый каталог прежде, чем начать печатать. –  Stéphane Chazelas 14.05.2015, 19:11

Возможно, Вы нуждаетесь в инструменте кроме ls?

Например, у Randal Schwartz есть запись в блоге об использовании perl на больших каталогах, которые могут содержать некоторые подсказки при создании чего-то, что удовлетворяет Ваши потребности.

В сообщении в блоге Randal объясняет это оба ls и find попытайтесь читать во всех записях каталога прежде, чем распечатать любого, в то время как perl решение, которое он предлагает, не делает.

4
27.01.2020, 19:30
  • 1
    я также думал, что это могло быть наилучшим вариантом, потому что и ls и находят чтение всем каталогом перед печатью. Я планировал записать рубиновый сценарий, чтобы сделать это вместо жемчуга, спасибо за это AFresh1! –  AndreDurao 27.09.2011, 19:37
  • 2
    @AndreDurao, 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 задержка с имеет другую причину, возможно, жесткий диск засыпает и нуждается в пробуждении?

У Вас есть такая задержка очень немногих файлов также?

1
27.01.2020, 19:30
  • 1
    Спасибо, но я не искал что-то как этот. Точно так же, как голова меньше выполняется с результатом всего ls результат. Я искал путь к самому ls для ограничения количества результатов. –  AndreDurao 24.01.2012, 13:40
  • 2
    @AndreDurao: Перемещенный мои комментарии в ответ. –  user unknown 25.01.2012, 18:05

Если производительность не является проблемой (как в вопросе, который был закрыт как дубликат этого), и вы хотите перечислить первые n файлов (в отличие от первых n строк вывода LS ) В списке не скрытых файлов отсортированы по имени файла, с ZSH , вы можете использовать:

ls -ld -- *([1,4])

, чтобы переписать первые 4 файла. ZSH все равно будет прочитать полное содержание каталога, хотя, даже если вы скажете это не сортировать с * (на [1,4]) (обратите внимание, что LS также сортирует этот список).

3
27.01.2020, 19:30
ls -lrth | tail

ls -lrth | tail -n 10

ls -lrth | grep *.gz | tail
0
27.01.2020, 19:30
$ cut -f 1,n filename

hará la tarea de obtener los primeros archivos n. nes el número de archivos que desea extraer. entonces el código completo será:

$ ls|cut -f 1,n file
-1
27.01.2020, 19:30

Теги

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