-bash: /usr/bin/ls: Lista de argumentos demasiado larga

-bash: /usr/bin/ls: Lista de argumentos demasiado larga

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/nullpara 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 repoin backup_repo, use rsync:

rsync -a repo/ backup_repo

O, si todo lo que necesita es una copia de seguridad, haga un tararchivo,

tar -c -f repo.tar repo

Si desea copiar solo los nombres visibles que *se expanden hacia el interior repoy 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 printfutilidad está integrada en el bashshell y, por lo tanto, no tendrá la misma limitación en el tamaño de la lista de argumentos que lstendría una utilidad externa.

información relacionada