![Слишком длинный список аргументов при использовании du](https://rvso.com/image/97215/%D0%A1%D0%BB%D0%B8%D1%88%D0%BA%D0%BE%D0%BC%20%D0%B4%D0%BB%D0%B8%D0%BD%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%20%D0%BF%D1%80%D0%B8%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20du.png)
У меня есть команда для поиска больших файлов в определенной папке, но по какой-то причине она не работает в определенных ситуациях, и я получаю ошибку "Список аргументов слишком длинный". Как исправить эту команду, чтобы она работала каждый раз?
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