Без «действия» (, такого как -print
), find
будет распечатывать каждый посещаемый файл. Именно из-за этого find -L. ( -name dest ) -prune -o -name "*.out"
по-прежнему отображаются удаляемые файлы. find
должен просмотреть файл, прежде чем он сможет оценить предоставленные вами условия.
Добавление действия -print
в конец команды find
должно помочь.
find -L. -name dest -prune -o -name "*.out" -print
Поскольку речь идет только о размере файла, концептуально все, что нужно, это
{
ssh server2 cat /path/to/access.log
cat /local/path/to/access.log
} | awk '{print $1}' | sort | uniq -c | sort -n | tail
Однако есть ряд вещей, которые можно сделать для повышения скорости.
Сначала отправьте по сети только IP-адреса, чтобы уменьшить пропускную способность.
{
ssh server2 awk '{print $1}' /path/to/access.log
cat /local/path/to/access.log
} | awk '{print $1}' | sort | uniq -c | sort -n | tail
Во-вторых, используйте преимущества хеширования awk, чтобы избавиться от необходимости сортировки. Это заменяет порядок n *lg (n )на порядок n. При этом используется ассоциативный массив с именем seen
для подсчета количества просмотров каждого IP-адреса, а в конце выводится количество и адрес.
{
ssh server2 awk '{print $1}' /path/to/access.log
cat /local/path/to/access.log
} | awk '{seen[$1]++} END {for (i in seen){print seen[i],i}}' | sort -n | tail
В-третьих, сортировка в обратном порядке, опять же для уменьшения объема данных, которые должны передаваться
{
ssh server2 awk '{print $1}' /path/to/access.log
cat /local/path/to/access.log
} | awk '{seen[$1]++} END {for (i in seen){print seen[i],i}}' | sort -rn | head
В зависимости от данных, вероятно, имеет смысл предварительно -обработать данные на удаленном веб-сервере. Массив(seen
переименован в s
, чтобы не печатать ). Здесь отправляемые данные представляют собой пары счетчиков и адресов. Затем мы добавляем их локально в третьем процессе awk.
{
ssh server2 awk '{s[$1]++}END{for (i in s){print s[i],i}}' /path/to/access.log
awk '{s[$1]++}END{for (i in s){print s[i],i}}' /local/path/to/access.log
} | awk '{s[$2]+=$1}END{for (i in s){print s[i],i}}' | sort -rn | head
Конечно, не проверено.