7

Есть ли способ ограничить количество результатов, возвращаемых командой FIND в системе Unix? У нас проблема с производительностью из-за необычно большого количества файлов в некоторых каталогах.

Я пытаюсь сделать что-то вроде:

find /some/log -type f -name *.log -exec rm {} ; | limit 5000

4 ответа4

19

Вы можете попробовать что-то вроде find [...] |head -[NUMBER] . Это отправит SIGPIPE для find когда head выводит свои сколько угодно строк, так что find не продолжает поиск.

4

Звучит так, будто ты ищешь ксарга, но пока не знаешь.

find /some/log/dir -type f -name "*.log" | xargs rm
0
find /some/log -type f -name *.log -exec rm {} ; | limit 5000

Ну, команда, указанная в кавычках, не будет работать, конечно (limit не является даже допустимой командой).

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

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

0

Просто |head у меня не сработала

root@static2 [/home/dir]# find . -uid 501 -exec ls -l {} \; | head 2>/dev/null
total 620
-rw-r--r--  1 root   root           55 Sep  8 15:22 08E7384AE2.txt
drwxr-xr-x  3 lamav statlus 4096 Apr 22  2015 1701A_new_email
drwxr-xr-x  3 lamav statlus 4096 Apr 22  2015 1701B_new_email
drwxr-xr-x  3 lamav statlus 4096 May 11  2015 1701C_new_email
drwxr-xr-x  2 lamav statlus 4096 Sep 24 18:58 20150924_test
drwxr-xr-x  3 lamav statlus 4096 Jun  4  2013 23141_welcome_newsletter
drwxr-xr-x  3 lamav statlus 4096 Oct 31  2012 23861_welcome_email
drwxr-xr-x  3 lamav statlus 4096 Sep 19  2013 24176_welco
drwxr-xr-x  3 lamav statlus 4096 Jan 11  2013 24290_convel
find: `ls' terminated by signal 13
find: `ls' terminated by signal 13
find: `ls' terminated by signal 13
find: `ls' terminated by signal 13
find: `ls' terminated by signal 13

(...так далее...)

Мое (определенно не лучшее) решение:

find . -uid 501 -exec ls -l {} \; 2>/dev/null | head

Недостатком является то, что само «find» не заканчивается после необходимого количества строк, а работает в фоновом режиме до ^ C или до конца, поэтому идеи приветствуются.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .