시스템 명령에 대한 인수 목록의 길이에는 최대 제한이 있습니다.이 제한은 MAX_ARG_PAGES
커널이 컴파일 될 때의 값을 기반으로 배포에 따라 다르며 커널을 다시 컴파일하지 않고는 변경할 수 없습니다.
쉘이 globbing을 처리하는 방식으로 인해 동일한 인수 ( "* .jpg")를 사용할 때 대부분의 시스템 명령에 영향을줍니다. glob가 먼저 쉘에 의해 처리 된 후 명령으로 전송되므로 명령은 다음과 같습니다.
cp -uf *.jpg /targetdir/
당신이 쓴 것처럼 쉘과 본질적으로 동일합니다 :
cp -uf 1.jpg 2.jpg ... n-1.jpg n.jpg /targetdir/
많은 jpeg를 다루는 경우 관리하기가 매우 빠릅니다. 이름 지정 규칙과 실제로 처리해야하는 파일 수 에 따라 한 번에 디렉토리의 다른 서브 세트 에서 cp 명령을 실행할 수 있습니다 .
cp -uf /sourcedir/[a-m]*.jpg /targetdir/
cp -uf /sourcedir/[n-z]*.jpg /targetdir/
이것은 효과적 일 수 있지만 파일 목록을 편리한 블록으로 얼마나 잘 나눌 수 있는지에 따라 정확히 얼마나 효과적입니까?
글로 블 가능. 나는 그 단어를 좋아한다.
find 및 xargs 와 같은 일부 명령 은 크기가 큰 인수 목록을 만들지 않고도 큰 파일 목록을 처리 할 수 있습니다.
find /sourcedir/ -name '*.jpg' -exec cp -uf {} /targetdir/ \;
간부 인수는 각 파일이 발견에 대해 한 번 명령 행의 나머지 실행됩니다 발견을 찾은 각 파일 이름으로 {} 대체. 때문에 CP의 명령은 한 번에 하나 개의 파일을 실행, 인수리스트의 제한은 문제가되지 않습니다.
각 파일을 개별적으로 처리해야하기 때문에 속도가 느려질 수 있습니다. xargs를 사용 하면보다 효율적인 솔루션을 제공 할 수 있습니다.
find /sourcedir/ -name '*.jpg' -print0 | xargs -0 cp -uf -t /destdir/
xargs 는 find 에서 제공하는 전체 파일 목록을 가져 와서 관리 가능한 크기의 인수 목록으로 분류 하고 각 하위 목록에서 cp 를 실행할 수 있습니다.
물론 커널을 다시 컴파일하여 더 큰 값을 설정할 수도 MAX_ARG_PAGES
있습니다. 그러나 커널을 다시 컴파일하는 것은이 답변에서 설명하고자하는 것보다 더 많은 작업입니다.