-bash: /usr/bin/ls: Lista de argumentos muito longa

-bash: /usr/bin/ls: Lista de argumentos muito longa

Quando estou usando este comando ls repo/* | xargs -I {} cp {} backup_repo/, estou recebendo o erro -bash: /usr/bin/ls: Argument list too long. Eu entendo que isso ocorre porque o bash realmente expande o asterisco para cada arquivo correspondente, produzindo uma linha de comando muito longa. Como posso corrigir esse erro?

Responder1

Use xargs --show-limits </dev/nullpara ver seus limites atuais.

Uma maneira melhor:

find repo -maxdepth 1 -type f -name '*' -print0 | \
  xargs -0 --no-run-if-empty  \
    cp --target-directory=./backup_repro/

É uma má ideia ter o diretório de backup no mesmo diretório dos arquivos dos quais você está fazendo backup. Isso pode levar ao backup de um backup que contém um backup que contém um ... e o tamanho de um backup se aproxima do infinito.

Ler man find xargs cp.

Responder2

Se você quiser apenas fazer uma cópia de repoin backup_repo, use rsync:

rsync -a repo/ backup_repo

Ou, se tudo que você precisa é de um backup, faça um tararquivo,

tar -c -f repo.tar repo

Se você quiser copiar apenas os nomes visíveis que *se expandem para dentro repoe pular quaisquer nomes ocultos (como .git), você poderá usar

printf '%s\0' repo/* | xargs -0 -I {} cp -R -- {} backup_repo

ou, assumindo GNU cp,

printf '%s\0' repo/* | xargs -0 cp -t backup_repo -R --

O printfutilitário é integrado ao bashshell e, portanto, não terá a mesma limitação no tamanho da lista de argumentos que um utilitário externo lsteria.

informação relacionada