Одно верно, другое нет.
du -sh *
(должно быть du -sh -- *
, чтобы избежать проблем с именами файлов, начинающимися с-
)
полагается на оболочку для расширения шара *
; du
видит все не -скрытые файлы и каталоги в текущем каталоге как отдельные аргументы. Это правильно обрабатывает специальные символы.
ls | xargs du -sh
полагается на xargs
для обработки вывода ls
. xargs
разделяет ввод на пробелы (по крайней мере пробел, табуляция и новая строка, больше с некоторыми реализациями ), также понимает некоторую форму кавычек и запускаетdu
(один (даже для пустого ввода¹ )или более вызовов )с каждой отдельной строкой, разделенной пробелами -, в качестве отдельных аргументов.
Оба кажутся эквивалентными, если ваш текущий каталог не содержит файлов с пробелами, одинарными кавычками, двойными кавычками или символами обратной косой черты в их именах, и если файлов достаточно (, но хотя бы один ), который xargs
выполняет только один du
вызов, но это не так.
С точки зрения эффективности, du -sh *
использует один процесс, ls | xargs du -sh
использует как минимум три. Существует один сценарий, в котором конвейерный подход будет работать, в то время как glob не будет :, если у вас слишком много файлов в текущем каталоге, оболочка не сможет запустить du
со всеми их именами за один раз., но xargs
будет выполняться du
столько раз, сколько необходимо, чтобы охватить все файлы, и в этом случае вы увидите несколько строк, а файлы с более чем одной жесткой ссылкой могут быть учтены несколько раз.
См. также Почему *не *parse `ls `?
¹ Если в текущем каталоге нет скрытого файла, отличного от -, du -sh -- *
либо завершится с ошибкой вашей оболочки, либо с некоторыми оболочками, такими как bash
, запустите du
с литералом *
в качестве аргумента и du
будет жаловаться на то, что этот файл *
не существует.
В то время как с ls | xargs du -sh --
, большинство xargs
реализаций (, за исключением некоторых BSD ), будут запускаться du
без аргументов и, таким образом, указывать использование диска в текущем каталоге (, а также включая диск использование самого файла каталога и всех скрытых файлов и каталогов в нем)