거의 250,000개의 파일이 있는 디렉토리가 있고, 많은 파일이 있으며 x개의 임의 파일을 다른 디렉토리로 이동하고 싶습니다.
shuf
및 mv
명령을 사용하여 솔루션을 검색하고 얻었습니다.여기그리고여기, 기본적으로 저는 이 명령을 사용하고 있습니다
$ 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
정렬되지 않은 파일 경로를 표시 하면서 전체 목록을 작성하고 정렬해야 하기 때문에 효율성이 떨어질 수 있습니다 .