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/null
para 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 repo
in backup_repo
, use rsync
:
rsync -a repo/ backup_repo
Ou, se tudo que você precisa é de um backup, faça um tar
arquivo,
tar -c -f repo.tar repo
Se você quiser copiar apenas os nomes visíveis que *
se expandem para dentro repo
e 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 printf
utilitário é integrado ao bash
shell e, portanto, não terá a mesma limitação no tamanho da lista de argumentos que um utilitário externo ls
teria.