2

Привет я делаю некоторые очистки на моем сервере, и я хочу знать, как я могу получить общий размер папки с файлами 1 МБ и более, а также 1 МБ и ниже. Я добрался до:

ls -lh | grep 'M '

Но я не могу получить общий размер всего.

2 ответа2

4

Вместо парсинга вывода ls (что считается очень плохой практикой ), вы можете использовать find и du следующим образом:

  • Чтобы найти все файлы (-type f) в текущем каталоге и подкаталогах размером ≥1M (-size -size +1M) и получить сумму их размеров:

    find . -type f -size +1M -print0 | du -sch --files0-from=- | tail -1
    
  • Аналогично, но не повторяется в подкаталогах (-maxdepth 1):

    find . -maxdepth 1 -type f -size +1M -print0 | du -sch --files0-from=- | tail -1
    
  • Для файлов размером ≤1M:

    find . -type f -size -1M -print0 | du -sch --files0-from=- | tail -1
    find . -maxdepth 1 -type f -size -1M -print0 | du -sch --files0-from=- | tail -1
    

Это работает, если ваша версия du поддерживает --files0-from . Если нет, вы можете попробовать это:

find . -type f -size +1M -exec du -sch {} + | tail -1

но если у вас слишком много файлов, это не сработает (вы получите неправильный ответ)! В этом случае вы можете попробовать это вместо:

find . -type f -size +1M -exec sh -c 'du -sch "$@" | tail -1' _ {} +

тогда у вас будет несколько строк (надеюсь, не слишком много), и вам придется делать математику самостоятельно.

С помощью find вас есть полный контроль над тем, какие файлы вы хотите рассмотреть! его возможности фильтрации в основном бесконечны.

Ура!


Вы получите неправильные ответы с ls -1h | grep 'M ' если у вас есть файлы, содержащие строку "M " . И вывод ls должен читаться людьми, а не машинами ... у машин есть и другие, гораздо лучшие способы получения информации такого рода.

0

Это сработало для меня.

ls -lh | grep 'M' | awk '{ SUM += $5} END {print SUM}'

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