이 명령을 사용하면 ls repo/* | xargs -I {} cp {} backup_repo/
오류가 발생합니다 -bash: /usr/bin/ls: Argument list too long
. 나는 이것이 일어나는 이유가 bash가 실제로 일치하는 각 파일에 별표를 확장하여 매우 긴 명령줄을 생성하기 때문이라는 것을 알고 있습니다. 이 오류를 어떻게 해결할 수 있나요?
답변1
xargs --show-limits </dev/null
현재 한도를 보는 데 사용됩니다 .
더 좋은 방법:
find repo -maxdepth 1 -type f -name '*' -print0 | \
xargs -0 --no-run-if-empty \
cp --target-directory=./backup_repro/
백업하려는 파일과 동일한 디렉터리에 백업 디렉터리를 두는 것은 좋지 않습니다. 다음을 포함하는 백업이 포함된 백업이 생성될 수 있으며 백업 크기는 무한대에 가까워질 수 있습니다.
읽다 man find xargs cp
.
답변2
repo
에 복사하려면 다음을 backup_repo
사용하십시오 rsync
.
rsync -a repo/ backup_repo
또는 백업만 필요한 경우 아카이브를 만드세요 tar
.
tar -c -f repo.tar repo
*
내부에서 확장되는 보이는 이름만 복사 repo
하고 숨겨진 이름(예 .git
: )을 건너뛰려면 다음을 사용할 수 있습니다.
printf '%s\0' repo/* | xargs -0 -I {} cp -R -- {} backup_repo
또는 GNU를 가정하면 cp
,
printf '%s\0' repo/* | xargs -0 cp -t backup_repo -R --
이 printf
유틸리티는 쉘에 내장되어 있으므로 bash
매개변수 목록 크기에 대해 외부 유틸리티와 동일한 제한이 없습니다 ls
.