Слишком длинный список аргументов при использовании du

Слишком длинный список аргументов при использовании du

У меня есть команда для поиска больших файлов в определенной папке, но по какой-то причине она не работает в определенных ситуациях, и я получаю ошибку "Список аргументов слишком длинный". Как исправить эту команду, чтобы она работала каждый раз?

jbsmith:/tmp$ sudo du -hsx * | sort -rh | head -10
-bash: /usr/bin/sudo: Argument list too long

решение1

Вы можете заменить эту команду на findкоманду globbling и сделать это

sudo find . -maxdepth 1 ! -name "." -exec du -hsx {} + | sort -rh | head -10

предполагая, что вы findподдерживаете эту +нотацию.

Это позволит найти все содержимое текущего каталога, не углубляясь в него, и проигнорировать «.» (спасибо за напоминание @rudimeier!)

Это включит все файлы в текущем каталоге, как и изначально имевшийся у вас глоб. В отличие от того глоб, это также найдет файлы, которые начинаются с .(если вы не играли с опциями оболочки, чтобы включить dotglobих).

решение2

Я наткнулся на этот вопрос, когда искал способ справиться с "слишком длинным списком аргументов" с помощью du. В моем случае я не хотел фильтровать вывод, а вместо этого получить сумму всех файлов, соответствующих шаблону. С подходами в других вопросах я не мог получить общую сумму, поскольку они в конечном итоге вызывались duнесколько раз с подмножеством аргументов.

Решением было использовать --files0-from=вместо передачи имен файлов в качестве аргументов.

В конце концов, мне это помогло:

du -Lhsc --files0-from=<(find -L -maxdepth 2 \( -name "*.gz" -o -name "*.xz" \) -print0)
  • -Lследуйте символическим ссылкам как при поиске, так и при расчете размера.
  • -cполучить совокупный итог
  • <()процесс замены для создания fileна лету
  • -print0соответствовать duожиданиям
  • \( \)чтобы иметь возможность использовать -oс двумя -nameаргументами

Точно так же ответ на поставленный выше вопрос может быть таким:

du -hsx --files0-from=<(find -maxdepth 1 ! -name "." -print0) | sort -rh | head -10

решение3

В последних версиях GNU coreutils вы можете использовать--max-depthвариантвместо перечисления файлов с помощью *. Таким образом, вы не рискуете столкнуться с ограничением длины командной строки, если файлов слишком много. Нет --min-depth, поэтому каталог верхнего уровня будет указан в конце.

du -x -d 1 | head -n -1 | sort -r | head -n 10

решение4

sudo ls | sudo parallel -j1 du -hsx | sort -rh | head -10

Связанный контент