Я не ищу инструмент. Я хочу написать хороший сценарий, чтобы я мог отправить его своим пользователям VPS, которые не знают, как это сделать.
Я искал способ собрать много данных об использовании диска с помощью сценария оболочки. На моей работе МНОГО людей звонят и спрашивают "почему мой диск заполнен" Я запускаю du -h --max-depth = 1 | sort -rn, но это немного неуклюже, и мне нужно копать дальше ....
Я пытаюсь разбить использование диска с помощью сценария оболочки следующим образом:
**home/ is consuming 400GB of disk space**</br>
home/user1 120GB
home/user2 200GB
**var/ is using 100GB of disk space**
Пока что я придумал следующее:
#!/bin/bash
for i in $(ls -d */ | grep -v proc);
do
printf "**** $i has the following breakdown ********\n"
du -h --max-depth=1 $i
done
Каким образом мои пользователи смогут лучше понять разбивку использования диска? Просто хочу иметь возможность завернуть использование в красивый розовый бант и сказать "удачи"
Что не так с вашим решением? Почему вы называете свой сценарий «неуклюжим»?
Я бы не сказал, что ваше решение неуклюже.
Добро пожаловать в Stack Overflow! Если вы считаете, что код работает правильно, рассмотрите возможность более полного представления вашей работы (с ее модульными тестами) на Проверка кода. Скорее всего, вы получите несколько предложений по тому, как сделать его более эффективным, более легким для чтения и лучшего тестирования. Прежде чем вы это сделаете, обязательно сначала прочтите Руководство по обзору кода для пользователей Stack Overflow, так как некоторые вещи там выполняются по-другому - например, в заголовках вопросов должно быть просто указано, что такое код делает, поскольку вопрос всегда звучит так: «Как я могу это улучшить?».
@InaTsetsova, я было бы говорю, что в оригинале есть несколько антипаттернов. См., Например, BashPitfalls # 1: $(ls) изначально подвержен ошибкам (также обсуждается в ПарсингLs). Аналогичным образом, расширения параметров никогда не должны использоваться в строке формата printf (следует использовать заполнители, такие как %s, и значения, передаваемые вне диапазона), а расширения всегда следует заключать в кавычки. Это все, что может идентифицировать shellcheck.net.
Если предполагаемый вопрос имел форму «как я могу выполнить Икс в UNIX, в том числе с помощью ответа, который включает в себя написание некоторого кода но не ограничиваясь тем же?» - именно так я и люди, добавляющие ответы, предлагающие готовые инструменты, читают это - Unix и Linux может быть лучшим форумом.
Привет, спасибо, ребята, за слова поддержки! Я здесь, сомневаюсь в себе ... :) Я ищу то, что, как мне кажется, @TobySpeight предлагает лучший (более красивый) способ сделать это
@CharlesDuffy Спасибо за это! Я собираюсь изучить это ... Пытался найти цикл вместо LS ... Было бы это чем-то менее подверженным ошибкам?
@CharlesWilson, ... Итак, find определенно имеет подходы, которые безопаснее, чем ls, но for x in $(find ...) все еще имеет те же проблемы. См. find ... -exec ... или find ... -print0 | while IFS= read -r -d '' piece; do ...; done, как описано в разделах «Действия», «Сложные действия» и «Групповые действия» в Использование поиска.
@CharlesDuffy просматривал TOS для этой платы. Думал, что я попал в сферу охвата, я пишу сценарий, чтобы предотвратить поломку диска для пользователей VPS, которые не знают, как контролировать свои собственные вещи: / ха-ха. Не ищу инструментов или чего-то в этом роде
Итак, общее руководство: если вы нажмете конкретный вопрос о bash в процессе построения скрипта (например, «почему мой скрипт не работает с томом, в имени каталога которого есть пробел?»), Он определенно попадет в область видимости. . Если вы искали функцию языка bash, опять же, она определенно входит в эту область. Если вы спрашиваете, почему не работает функция языка bash, это определенно входит в область действия. "Как лучше всего выполнить эта большая цель в bash?" более нечеткий; иногда это может быть в рамках, иногда нет. Чем конкретнее вопрос, тем лучше.
@CharlesDuffy имеет смысл !!!!!! Спасибо, сэр! Я обращусь к этому в будущем. и еще раз спасибо за идеи.
@CharlesWilson: Часто речь идет о том, как сформулирован вопрос - ознакомьтесь с этим мета-вопросом о том, какой рекомендательный вопрос не по теме - meta.stackoverflow.com/questions/254393/…. Я немного отредактировал ваш вопрос, чтобы было понятнее, в чем заключается ваша проблема и почему вашего решения может быть недостаточно для вас. Однако заполнить пробелы можете только вы. Убедитесь, что вы ясно дали понять, в чем проблема и что вы ищете, и почему ваш текущий сценарий не решает ее. Сосредоточен на проблеме, а не на ее решении. Тогда это не было бы не по теме.





you snippet - хорошее начало, вы не можете сделать это в одной строке. для некоторых папок вам нужна глубина> 1 (главная), а для некоторых других глубина = 1 (var)
Попробуйте ncdu (использование диска NCurses), например:
$ ncdu -q -x
Варианты:
-q Quiet mode. While scanning or importing the directory, ncdu will
update the screen 10 times a second by default, this will be
decreased to once every 2 seconds in quiet mode. Use this
feature to save bandwidth over remote connections.
А также
-x Do not cross filesystem boundaries, i.e. only count files and
directories on the same filesystem as the directory being
scanned.
Больше примеров здесь: https://dev.yorhel.nl/ncdu/man#EXAMPLES
Это хороший инструмент, но если это правильный ответ, значит, вопрос здесь явно не по теме.
Спасибо! и этот инструмент был бы хорош. Если бы заказчик знал, что они делают, я хотел бы быстро сказать: «Эй, ваш диск используется при использовании 400 Гбайт, потому что дома / использует 200 Гбайт» и разбить его на фиктивный стиль. ржу не могу
Вот альтернативное решение. Вы можете использовать tree для отображения содержимого каталога в «древовидном» формате. Затем вы можете объединить его с флагом использования диска, чтобы увидеть вложенные каталоги и их размер.
tree -L 2 --du -h
Флаг '-L' определяет глубину или уровень вашего запроса.
Это даст вам следующий результат:
Вы даже можете создать XML-файл, который можно открыть в браузере, вот так:
tree -L 2 --du -h -H s > disk_usage.html
Затем вы можете открыть файл в браузере, и результат будет выглядеть следующим образом:
Надеюсь это поможет!
!!! Забыл дерево !!!!!!!! это скрипт? так что я могу сказать, просто закинуть это в мой скрипт в лу ДУ?
@CharlesWilson, если вы напишете его в файл и сделаете исполняемым, он запустится. Попробуйте это в своем скрипте, он должен работать. Если ответ работает для вас, не забудьте принять его :)