Há um limite máximo para quanto tempo uma lista de argumentos pode ter para comandos do sistema - esse limite é específico da distribuição com base no valor de MAX_ARG_PAGES
quando o kernel é compilado e não pode ser alterado sem recompilar o kernel.
Devido à maneira como o globbing é tratado pelo shell, isso afetará a maioria dos comandos do sistema quando você usar o mesmo argumento ("* .jpg"). Como o glob é processado pelo shell primeiro e depois enviado ao comando, o comando:
cp -uf *.jpg /targetdir/
é essencialmente o mesmo para o shell, como se você tivesse escrito:
cp -uf 1.jpg 2.jpg ... n-1.jpg n.jpg /targetdir/
Se você está lidando com muitos jpegs, isso pode se tornar incontrolável muito rapidamente. Dependendo da sua convenção de nomenclatura e do número de arquivos que você realmente precisa processar, é possível executar o comando cp em um subconjunto diferente do diretório por vez:
cp -uf /sourcedir/[a-m]*.jpg /targetdir/
cp -uf /sourcedir/[n-z]*.jpg /targetdir/
Isso poderia funcionar, mas exatamente o quão eficaz seria se baseia em quão bem você pode dividir sua lista de arquivos em blocos convenientes.
Globbable. Eu gosto dessa palavra.
Alguns comandos, como o find e o xargs , podem lidar com grandes listas de arquivos sem criar listas de argumentos de tamanho reduzido.
find /sourcedir/ -name '*.jpg' -exec cp -uf {} /targetdir/ \;
O argumento -exec executará o restante da linha de comando uma vez para cada arquivo encontrado por find , substituindo o {} por cada nome de arquivo encontrado. Como o comando cp é executado apenas em um arquivo por vez, o limite da lista de argumentos não é um problema.
Isso pode ser lento devido à necessidade de processar cada arquivo individualmente. Usar xargs poderia fornecer uma solução mais eficiente:
find /sourcedir/ -name '*.jpg' -print0 | xargs -0 cp -uf -t /destdir/
O xargs pode pegar a lista completa de arquivos fornecida pelo find e dividi-la em listas de argumentos de tamanhos gerenciáveis e executar cp em cada uma dessas sublistas.
Obviamente, também há a possibilidade de recompilar seu kernel, configurando um valor maior para MAX_ARG_PAGES
. Mas recompilar um kernel é mais trabalhoso do que estou disposto a explicar nesta resposta.