O que você deve ver é que, em ambos os casos, você provavelmente não obterá o uso de espaço em disco de suas imagens. Se você tem milhares de fotos, provavelmente em ambos os casos excede o limite para a chamada exec.
Por quê? Bem, o comando -exec (...) +
adiciona parâmetros à chamada do sistema execvp
. A página man define o limite de sua chamada de sistema subjacente como segue (extrair da página de manual execve ):
Limits on size of arguments and environment
Most UNIX implementations impose some limit on the total size of the
command-line argument (argv) and environment (envp) strings that may be
passed to a new program. (...)
On kernel 2.6.23 and later, most architectures support a size limit
derived from the soft RLIMIT_STACK resource limit (see getrlimit(2))
that is in force at the time of the execve() call. (...) This change
allows programs to have a much larger argument and/or environment list.
For these architectures, the total size is limited to 1/4 of the
allowed stack size. (...) Since Linux 2.6.25, the kernel places a floor
of 32 pages on this size limit, so that, even when RLIMIT_STACK is set
very low, applications are guaranteed to have at least as much argument
and environment space as was provided by Linux 2.6.23 and earlier (This
guarantee was not provided in Linux 2.6.23 and 2.6.24.) Additionally,
the limit per string is 32 pages (the kernel constant MAX_ARG_STRLEN),
and the maximum number of strings is 0x7FFFFFFF.
Portanto, se você tiver uma longa lista de arquivos, poderá atingir rapidamente os limites do sistema. Além disso, quando o caminho relativo é maior, ele está usando mais memória, o que pode fazer com que você atinja os limites mais rapidamente, daí os resultados diferentes de seus dois comandos.
Existe uma solução
Uma solução nos sistemas GNU é usar uma lista de entrada de arquivos para du
usando as opções --files0-from
. Com o seu exemplo:
find Selbstgemacht -type f -iname '*.jpg' -print0 | du --files0-from=- -ch
O primeiro comando lista todos os arquivos e os gera na saída padrão separada por NUL ( du
). Essa lista é "ingerida" por -
da entrada padrão (o du
nome do arquivo) e %code% soma o total.