Cuando uso este comando ls repo/* | xargs -I {} cp {} backup_repo/
, aparece el error -bash: /usr/bin/ls: Argument list too long
. Entiendo que la razón por la que esto ocurre es porque bash en realidad expande el asterisco a cada archivo coincidente, lo que produce una línea de comando muy larga. ¿Cómo puedo solucionar este error?
Respuesta1
Úselo xargs --show-limits </dev/null
para ver sus límites actuales.
Una mejor manera:
find repo -maxdepth 1 -type f -name '*' -print0 | \
xargs -0 --no-run-if-empty \
cp --target-directory=./backup_repro/
Es una mala idea tener su directorio de respaldo en el mismo directorio que los archivos que está respaldando. Podría llevar a realizar una copia de seguridad de una copia de seguridad que contenga una copia de seguridad que contenga un... y el tamaño de una copia de seguridad se acerque al infinito.
Leer man find xargs cp
.
Respuesta2
Si solo desea hacer una copia de repo
in backup_repo
, use rsync
:
rsync -a repo/ backup_repo
O, si todo lo que necesita es una copia de seguridad, haga un tar
archivo,
tar -c -f repo.tar repo
Si desea copiar solo los nombres visibles que *
se expanden hacia el interior repo
y omitir los nombres ocultos (como .git
), entonces podría usar
printf '%s\0' repo/* | xargs -0 -I {} cp -R -- {} backup_repo
o, asumiendo GNU cp
,
printf '%s\0' repo/* | xargs -0 cp -t backup_repo -R --
La printf
utilidad está integrada en el bash
shell y, por lo tanto, no tendrá la misma limitación en el tamaño de la lista de argumentos que ls
tendría una utilidad externa.