2014-01-15 4 views
14

Я новичок в Linux. У меня есть каталог в linux с примерно 250 000 файлами Мне нужно найти количество файлов, соответствующих шаблону.Найти количество файлов, соответствующих шаблону в каталоге в linux

Я попытался использовать следующую команду:

ls -1 20061101-20131101_kh5x7tte9n_2010_* | wc -l 

я получил следующее сообщение об ошибке:

-bash: /bin/ls: Argument list too long 
0 

Пожалуйста, помогите. Заранее спасибо

ответ

29

Это может быть лучше использовать find для этого:

find . -maxdepth 1 -name "20061101-20131101_kh5x7tte9n_2010_*" | wc -l 

find будет возвращать список файлов, удовлетворяющих критериям. -maxdepth 1 сделает поиск выполненным только по пути, не будет подкаталогов (thanks Petesh!).

Затем wc -l укажет количество линий.


Производительность Comparation из двух возможных вариантов:

Давайте создадим 10 000 файлов с помощью этого шаблона:

$ for i in {1..10000}; do touch 20061101-20131101_kh5x7tte9n_201_$i; done 

А потом сравнить время, необходимое, чтобы получить результат с ls -1 ... или find ...:

$ time find . -maxdepth 1 -name "20061101-20131101_kh5x7tte9n_201_*" | wc -l 
10000 

real 0m0.034s 
user 0m0.017s 
sys  0m0.021s 

$ time ls -1 | grep 20061101-20131101_kh5x7tte9n_201 | wc -l 
10000 

real 0m0.254s 
user 0m0.245s 
sys  0m0.020s 

find в 5 раз быстрее! Но если мы используем ls -1f (thanks Petesh again!), то ls даже быстрее, чем find:

$ time ls -1f | grep 20061101-20131101_kh5x7tte9n_201 | wc -l 
10000 

real 0m0.023s 
user 0m0.020s 
sys  0m0.012s 
+2

Чтобы предотвратить рекурсию в подкаталоги, вы можете использовать '-maxdepth 1' (если он поддерживается в этой версии поиска) – Petesh

+0

Хороший, @Petesh, просто обновленный соответственно, спасибо! – fedorqui

+2

У ls есть плохая привычка сортировки перед выводом, вы должны проверить с помощью 'ls -1 -f', чтобы получить аналогичное поведение, как найти для оценки производительности. – Petesh

3

Попробуйте это:

ls -1 | grep 20061101-20131101_kh5x7tte9n_2010_ | wc -l 
1

вы получили «аргумент слишком долго», потому что оболочка расширяет свой шаблон в список файлы. попробовать:

find -maxdepth 1 -name '20061101-20131101_kh5x7tte9n_2010_*' |wc -l 

Пожалуйста, обратите внимание - модель заключена в кавычки, чтобы предотвратить разлета оболочки

-2
ls -1 | grep '20061101-20131101_kh5x7tte9n_2010_*' | wc -l 

Предыдущий ответ не включены в кавычки критериев поиска ни символ *.

+0

Это в основном повторение предыдущего ответа, и это не сработает. – blm

Смежные вопросы