Считать общее количество файлов в определенном каталоге с определенным расширением

Вы можете использовать ssh для туннелирования любого порта под SSH.

sudo ssh -L 139:localhost:139 user@server

Теперь, если вы попытаетесь подключиться к порту 139 на своем компьютере, вы будете подключаться к 139 на сервере. Примечания:

Вам нужно использовать sudo для открытия привилегированного порта (& lt; 1024) на вашем компьютере, но это не приятно. Он не будет работать, если вы уже используете порт 139 (т. Е. Вы используете samba на локальном компьютере). Вам нужно будет использовать ваш локальный компьютер по IP (мы не туннелируем nbm).

Не нравится вообще, но это лучшая идея, которая у меня есть.

1
задан 25 April 2014 в 00:39

6 ответов

К сожалению, эту проблему трудно решить так, чтобы поддерживать все имена файлов и переноситься. Это безопасно (он обрабатывает скрытые файлы, пути, содержащие пробелы, тире и даже новые строки) и совместимый с POSIX:

find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c

Если вы не хотите, чтобы он был рекурсивным, просто добавьте -maxdepth 1. [ ! d3]

Этот

Тест:

$ cd -- "$(mktemp -d)"
$ touch -- -foo.mp4 .bar.mp4 .bat.mp4 'baz.mp4
> ban.mp4'
$ find . -mindepth 1 -type f -name "*.mp4" -exec printf x \; | wc -c
4

Сравните с принятым ответом:

$ ls -lR ./*.mp4 | wc -l
3

Или другие предложения:

$ find . -name "*.mp4" | wc -l
5
$ ls -1 *.mp4 | wc -l
ls: invalid option -- '.'
Try 'ls --help' for more information.
0
$ find . -name "*.mp4" | wc -c # Answer fixed at a later time
51
$ find . -name "*.mp4" | wc -l
5
$ find . | grep -i ".mp4$" | wc -l
5
$ ls . | grep ".mp4$" | wc -l
3
32
ответ дан 24 May 2018 в 08:41
  • 1
    Хотя этот ответ правильный и надежный, вы можете использовать -printf x вместо -exec printf x \;. То есть: find /path/to/directory -mindepth 1 -type f -name "*.mp4" -printf x | wc -c Не нужно -exec использовать внешнюю команду printf, которая, если количество файлов будет очень медленным , поскольку find имеет fork (2 ) от самой копии, а затем execve (2) /usr/bin/printf. С -exec printf x \; это нужно сделать один раз для каждого файла . – Eliah Kagan 10 October 2017 в 20:39
  • 2
    -printf не поддерживается в POSIX find , поэтому я его не использовал. – l0b0 11 October 2017 в 09:49
  • 3
    Также не используются -mindepth и -maxdepth, которые вы использовали. – Eliah Kagan 11 October 2017 в 13:34
  • 4
    Хороший момент, я не понял этого! – l0b0 11 October 2017 в 21:27
  • 5
    BSD find содержит -mindepth и -maxdepth, но не содержит -printf, поэтому я ценю включение обоих. – Joseph 9 February 2018 в 19:09

Это находит, сортирует и перечисляет все файлы по расширению в порядке:

find . -type f | sed 's/.*\.//' | sort | uniq -c
7
ответ дан 24 May 2018 в 08:41
  • 1
    Отлично! Я просто добавил бы | sort -rn в конце и, возможно, -mindepth 1, если только текущий каталог. – Pablo Bianchi 25 May 2017 в 02:41
  • 2
    И, может быть, труба до head -n, чтобы получить верхнюю n. – Raman 10 July 2017 в 03:55

Я думаю, что это очень просто, как следующие команды:

$ find . -name "*.mp4" | wc -l
8

или

$ find . | grep -i ".mp4$" | wc -l
8

Я думаю, что вышеприведенные команды вычисляют количество имен файлов и каталогов *.mp4

, поэтому я предлагаю вам использовать параметр -type f в качестве параметра find следующим образом:

$ find . -name "*.mp4" -type f | wc -l
8

Кроме того, ls -lR можно использовать как find .

3
ответ дан 24 May 2018 в 08:41

Вы можете использовать ls -1 *.mp4 | wc -l.

Здесь будут перечислены все файлы, заканчивающиеся на .mp4, печать каждого файла на новой строке (ls -1 *.mp4), вывод на выход wc, который будет подсчитайте количество новых строк, используя флаг -l.

0
ответ дан 24 May 2018 в 08:41
  • 1
    Не уверен, почему это было приостановлено, оно работает – Panther 24 April 2014 в 21:13
  • 2
    Поскольку *.mp4 разворачивается оболочкой, а не ls, это не сработает, если в каталоге столько файлов .mp4, что список из них не может быть передан в ls в качестве аргументов. – David Richerby 24 April 2014 в 22:06
  • 3
    @Rmana Проверьте его в каталоге, содержащем файл с именем --.mp4 – David Richerby 25 April 2014 в 00:33
  • 4
    @DavidRicherby да, вы правы. -- разрешит второй случай; первый будет поднимать сообщение об ошибке (вам нужно много файлов!) и еще один приятный вопрос. Угловые шкафы, но стоит отметить, да. – Rmano 25 April 2014 в 17:59
  • 5
    @Rmano Не добавляя -q или -b, это делает не допустимым символом новой строки в именах файлов. Если вы запустили ls -1 *.mp4 с вашего терминала без трубки, ls видит, что его stdout является терминалом и принимает -q, как подразумевалось, печать ? s. Но это поведение исчезает, когда выход передается. ls -1 *.mp4 | wc -l overcounts, если есть новые строки. ls -1 *.mp4 | cat показывает, что видит wc ". (Аналогично, -1 подразумевается, когда stdout не является терминалом, поэтому он является необязательным.) [F11] почти работает, но не с нулевыми файлами .mp4. – Eliah Kagan 11 October 2017 в 14:42

Это должно дать вам список файлов с .mp4

ls /path/to/directory | grep ".mp4$"

Если в сочетании с wc -l вы получите счет

ls /path/to/directory | grep ".mp4$" | wc -l

, если вы хотите, чтобы поиск включал подкаталоги

ls -lR /path/to/directory | grep ".mp4$" | wc -l
0
ответ дан 24 May 2018 в 08:41
  • 1
    не дает счет – Panther 24 April 2014 в 21:15
  • 2
    дал его мне при использовании с wc -l – Back.Slash 24 April 2014 в 21:16
  • 3
    используйте ls без трубопроводов для grep и сократите свой ответ. Он был опубликован как минимум дважды. – Panther 24 April 2014 в 21:19
  • 4
    @ bodhi.zazen ls /directory/*.mp4 заставляет оболочку расширять glob и выполнять что-то вроде ls /directory/file1.mp4 /directory/file2.mp4 .... Это не удастся, если каталог содержит больше файлов mp4, чем может быть передан как аргументы ls. – David Richerby 24 April 2014 в 22:03
  • 5
    @DavidRicherby - это не моя команда ls, я использую find;) – Panther 24 April 2014 в 22:14

Сначала перейдите в нужный каталог. Например:

cd ~/Videos

Затем:

ls -la | grep ".mp4" | wc -l

В этом списке содержится содержимое вашего каталога, включая скрытые файлы, с одним файлом на строку. Он передает результат grep, который будет показывать только элементы, содержащие расширение .mp4. Этот список затем передается в «количество слов» для подсчета строк.

В результате будет выведено количество строк, которые соответствуют, что будет соответствовать количеству файлов .mp4, которые у вас есть в этом каталоге. [ ! d3]

-3
ответ дан 24 May 2018 в 08:41
  • 1
    Хотя это также работает, просто используйте ls без трубы. – Panther 24 April 2014 в 21:14
  • 2
    Это не работает. Он дает неправильный ответ, если каталог содержит файл, называемый «.mp45», например. Он также терпит неудачу, если в их именах есть файлы с символами новой строки. Кстати, "grep -c" выводит только количество совпадающих строк. – David Richerby 24 April 2014 в 21:53
  • 3
    @DavidRicherby Проблемы идут глубже. . в регулярном выражении соответствует любому символу , поэтому учитываются имена, такие как lamp4judy.html. ls -l показывает цели символической ссылки (foo -> bar); если цель имеет mp4 в своем имени, ссылка подсчитывается. Имена файлов, содержащие новые строки, подсчитываются более одного раза, поскольку они печатаются буквально, если не переданы -b или -q или stdout - это терминал, который является не , когда stdout - это труба (до grep). ls -1q | grep -c '\.mp4$', вероятно, можно было бы использовать. – Eliah Kagan 11 October 2017 в 15:29

Другие вопросы по тегам:

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