ls с находкой:: сообщите об общем размере

Можно использовать pam_ssh_agent_auth модуль. Довольно просто скомпилировать, и затем просто добавить запись

auth       sufficient pam_ssh_agent_auth.so file=~/.ssh/authorized_keys

перед другим auth (или include) записи в /etc/pam.d/sudo

и

Defaults    env_keep += "SSH_AUTH_SOCK"

кому: /etc/sudoers (через visudo).

Теперь каждый пользователь может или пройти проверку подлинности к sudo через (переданный или локальный) агент SSH или их пароль. Может быть мудро попросить, чтобы Ваши пользователи использовали ssh-add -c таким образом, что каждый sudo вызов, по крайней мере, потребует некоторого подтверждения.

5
05.12.2013, 14:36
6 ответов

Хотите верьте, хотите нет, можно сделать это с find и du. Я использовал подобную технику, что я описал на своем блоге некоторое время движение. Та статья названа: [острота]: Вычисление Использования дискового пространства для Списка Файлов Используя du в соответствии с Linux.

Суть того сообщения является командой, такой как это:

$ find -maxdepth 2 -type f | tr '\n' '\0' | du -ch --files0-from=-

Пример

Это перечислит размер всех файлов наряду с общим итогом.

$ find -maxdepth 2 -type f | tr '\n' '\0' | du -ch --files0-from=- | tail -10
0   ./92086/2.txt
0   ./92086/5.txt
0   ./92086/14.txt
0   ./92086/19.txt
0   ./92086/18.txt
0   ./92086/17.txt
4.0K    ./load.bash
4.0K    ./100855/plain.txt
4.0K    ./100855/tst_ccmds.bash
21M total

Примечание: Это решение требует этого du поддерживайте --files0-from= переключатель, который является переключателем GNU к моему знанию.

выборка из du страницы справочника

--files0-from=F
          summarize disk usage of the NUL-terminated file names specified in 
          file F; If F is - then read names from standard input

Также этот метод страдает от неспособности иметь дело со специальными символами в именах файлов, таких как пробелы и нераспечатки.

Примеры

du: cannot access `./101415/fileD': No such file or directory
du: cannot access `E': No such file or directory

С ними можно было иметь дело путем представления больше tr .. .. команды для замены ими с альтернативными символами. Однако существует лучший путь, если у Вас есть доступ к GNU find.

Улучшения

Если Ваша версия find предложения --print0 переключитесь затем, можно использовать это колдовство, которое имеет дело с файлами, которые имеют пробелы и/или специальные символы, которые не являются печатаемыми.

$ find -maxdepth 2 -type f -print0 | du -ch --files0-from=- | tail -10
0   ./92086/2.txt
0   ./92086/5.txt
0   ./92086/14.txt
0   ./92086/19.txt
0   ./92086/18.txt
0   ./92086/17.txt
4.0K    ./load.bash
4.0K    ./100855/plain.txt
4.0K    ./100855/tst_ccmds.bash
21M total
6
27.01.2020, 20:32

du (использование диска) количество файлы пространства поднимает. Передайте свои найденные файлы ему и направьте его для суммирования (-c) и печать в человекочитаемом формате (-h) вместо количеств байта. Эй затем получит размеры всех файлов, завершенных с общим итогом. Если Вы только интересуетесь этой последней строкой, Вы можете затем tail для него.

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

find -maxdepth 2 -type f -print0 | xargs -0 du -ch | tail -n1

Если Вы будете ожидать находить много файлов, которые разрывают количество аргументов maximum, то xargs разделит их на несколько du вызовы. Затем Вы могли работать вокруг с заменой tail с a grep, тот единственные шоу строки суммирования.

find -maxdepth 2 -type f -print0 | xargs -0 du -ch | grep -P '\ttotal$'
6
27.01.2020, 20:32
  • 1
    +1, который Он приведет к сбою для файлов с пространством на их имя, все же. –  Joseph R. 05.12.2013, 16:31
  • 2
    Это перестанет работать также, если список файлов будет чрезвычайно длинен. Вы буквально разворачиваете весь список файлов от $(find ..) команда и передача его как args к du -ch. Но в повышении это абсолютно применимо! Также страдает от пробелов и нераспечаток. –  slm♦ 05.12.2013, 16:40
  • 3
    от заданий Это теперь заботится о пробелах и существует также подсказка для подавляющего списка аргументов. –  XZS 05.12.2013, 17:04

Если Вы только собираетесь вычислить размер максимальных двух уровней каталога, почему бы не звонить du непосредственно?

du -ch dir/* dir/*/* | tail -1

Это заставляет оболочку развернуть два уровня каталогов к списку имен и передает их как аргументы du который вычисляет сумму.

2
27.01.2020, 20:32
  • 1
    arg list too long ? –  jlliagre 05.12.2013, 17:04
  • 2
    @jlliagre. Я не знаю максимальное количество аргументов, принятых du, но эта команда достаточна для большинства (тривиальных) случаев, которым я верю. –   05.12.2013, 17:13
  • 3
    Предел не от du но оболочка и в конечном счете зависимый от операционной системы (на Linux MAX_ARG_PAGES). –  jlliagre 05.12.2013, 17:21

Другой подход: мы просто нуждаемся в размере файла и не заботимся об именах файлов, таким образом, мы можем избавиться от любых "странных" имен файлов, таких как "имена с CR в них, имена с пробелами, и т.д.":

 find /some/path -maxdepth 2 -type f -ls -exec printf '\000' \; \
     | tr -cd ' -~\000' \
     | tr '\000' '\n'   \
     | awk  '{ sum+=$7 } END { print "total size: ",sum }'

Прием:

1) мы печатаем вывод "-ls" каждого файла, СОПРОВОЖДАЕМЫЙ "\000" символ (на следующей строке, но это не проблема, посмотрите шаг 2),
2) мы избавляемся от всего 'non-ascii-printable' (включая '\t' и '\n'. Но мы действительно сохраняем также \000 в дополнение к "регулярному" печатаемому ASCII, поскольку нам нужен он для знания, где строка каждого файла заканчивается!). Тем путем имена файлов больше не имеют никаких причуд в них (никакой '\n', никакой '\t', не''; и т.д.). Мы действительно сохраняем пробелы также, поскольку нам нужны они также для обнаружения 7-го поля "-ls", т.е. размера файла
3) мы переводим добавленные '\000' в '\n' (шаг 2), избавленный от тех также, в случае, если некоторые имена файлов содержали их также!)
4) затем мы добавляем 7-й столбец для получения заключительного размера в байтах.

Это очень портативно (не нуждайтесь в "-print0", и т.д.),

3
27.01.2020, 20:32
  • 1
    я делаю это этот способ 1) избежать ограничения на количество имен файлов 2), избегает любой проблемы с любым видом имен файлов (они не могут содержать '\000' дизайном), 3) мобильность: во многих системах у Вас нет GNU, находят только прежней версии [мой даже не имеет -printf .... иначе я мог просто просто произвести размер файла только...] –  Olivier Dulac 05.12.2013, 16:19
  • 2
    шаги 1), 2), 3) и 4) также соответствуют различным строкам в опросе –  Olivier Dulac 05.12.2013, 16:50
  • 3
    maxdepth опция не требуется POSIX. –  James Youngman 10.12.2013, 01:08
  • 4
    @JamesYoungman: Я выбирал варианты OP для лучше отражения его потребностей. Но у меня нет его в некоторых моих системах, действительно. кроме той опции, остальные должны работать над "любой" системой Unix. –  Olivier Dulac 10.12.2013, 11:14

find -maxdepth 2 -type f --print0 | xargs -0 du -ch

1
27.01.2020, 20:32
  • 1
    , если список файлов длиннее, чем командная строка, позволяет, xargs назовут многократно, и у Вас будет общий итог для каждого вызова. –  Anthon 05.12.2013, 15:04
  • 2
    , Который еще более масштабируем, чем мой подход, который просто перестанет работать, когда будет больше файлов, чем возможные аргументы. –  XZS 05.12.2013, 15:14
  • 3
    Это не будет работать, если будут какие-либо пробелы или новые строки в именах файлов. Необходимо использовать ... --print0 | xargs -0 du ... –  Zelda 05.12.2013, 15:47

Это - простой путь, который обрабатывает любые нечетные имена файлов, которые могут быть найдены:

find . -maxdepth 2 -type f -exec du -ch {} + | grep -w "total"

Если существует действительно большое количество файлов под текущим каталогом, у Вас могла бы быть больше чем одна общая отображенная строка. Могли бы быть также нежелательные общие строки, если некоторые имена файлов содержат изолированное"total", например: файл называют"Grand total file.txt"

0
27.01.2020, 20:32

Теги

Похожие вопросы