shuf 및 mv를 사용하여 임의 파일 이동 - 매개변수 목록이 너무 깁니다.

shuf 및 mv를 사용하여 임의 파일 이동 - 매개변수 목록이 너무 깁니다.

거의 250,000개의 파일이 있는 디렉토리가 있고, 많은 파일이 있으며 x개의 임의 파일을 다른 디렉토리로 이동하고 싶습니다.

shufmv명령을 사용하여 솔루션을 검색하고 얻었습니다.여기그리고여기, 기본적으로 저는 이 명령을 사용하고 있습니다

$ shuf -n 5533 -e trainB/* | xargs -i mv {} testB/

하지만 다음 오류가 발생합니다.

bash: /usr/bin/shuf: Argument list too long

파일 수가 많아 매개변수 목록이 너무 긴 것 같은데, 다른 방법이 있나요?

SLES12 SP2에서 실행 중입니다.

답변1

SLES를 사용하고 있으므로 GNU 확장을 사용하여 더욱 안전하게 만들 수 있습니다.

find trainB -mindepth 1 -maxdepth 1 ! -name '.*' -print0 |
  shuf -n 5533 -z |
  xargs -r0 mv -t testB

find파일 목록을 처리하는 데 사용됩니다.통과하다명령줄 인수 대신 파이프를 사용하고, 이를 섞고, 출력을 제한하고, 마지막으로 testB. 로 이동하고, newline 대신 nul 종결자를 사용하도록 하는 옵션도 있습니다 -print0.-z-0

대신 다음을 사용할 수 있습니다 find.

printf '%s\0' trainB/*

printf내장되어 있으므로 bash이에 영향을 받지 않습니다.인수 목록이 너무 깁니다.시스템 호출 제한 execve(). 그러나 쉘은 find정렬되지 않은 파일 경로를 표시 하면서 전체 목록을 작성하고 정렬해야 하기 때문에 효율성이 떨어질 수 있습니다 .

관련 정보