/usr/bin/truncate: 매개변수 목록이 너무 깁니다.

/usr/bin/truncate: 매개변수 목록이 너무 깁니다.

truncate이 명령을 사용하여 테스트용으로 많은 수의 작은 파일을 만들고 싶습니다 . 적은 수의 파일(100개)로 명령을 실행해 보았더니 성공했습니다. 숫자를 1000000으로 변경하면 오류가 발생합니다.

root:[~/data]# truncate -s 1k {1..100}
root:[~/data]# rm -rf *
root:[~/data]# truncate -s 1k {1..1000000}
-bash: /usr/bin/truncate: Argument list too long
root:[~/data]#

어떻게 해결할 수 있나요? 작동할 수 있을 것 같은 느낌이 들지만 xargs작동하도록 할 수는 없습니다.

답변1

넌 할 수있어

echo {1..1000000} | xargs truncate -s 1k

(이것은 명령줄 길이에 관계없이 내장 에코가 있는 쉘과 함께 사용해야 합니다. xargs입력은 기본적으로 공백으로 분할되지만 여기서는 중요하지 않습니다.)

위의 코드는 많은 메모리를 사용할 수 있으므로 seqmosvy의 설명과 같이 사용하는 것이 더 나을 수 있습니다.

seq 1 1000000 | xargs truncate -s 1k

그러나 나는 일반적으로 루프를 사용합니다(이것은 000000not 으로 시작 1하고 모든 이름에 앞에 0이 있습니다).

for i in {000..999}; do
    touch "$i"{000..999}
done

하나의 디렉터리에 백만 개의 파일이 있으면 속도가 느려질 수 있으므로 테스트만 하는 것이 아니라면 파일을 다음과 같은 하위 디렉터리에 분산시키는 것이 좋습니다.

for i in {000..999}; do
    mkdir "$i"
    touch "$i"/{000..999}
done

이러한 파일이 하나의 명령줄에 맞지 않아 생성할 수 없고 어떻게든 문제를 해결할 수 없는 경우 rm -f *이러한 파일을 사용하여 파일을 삭제할 수 없을 수도 있습니다. 전체 트리를 재귀적으로 삭제해야 합니다 find -maxdepth 1 -type f -delete.

답변2

논리를 설명하는 @ilkkachu의 훌륭한 답변에 의견을 추가하세요. 주문하다

truncate -s 1k {1..1000000}

truncate전화백만이는 대부분의 시스템에서 시스템 호출 에 대한 인수 및 환경 변수의 누적 수와 크기에 대한 기본 제한을 훨씬 초과 truncate하는 것 입니다 . 그러므로argv[0]-s1kexecve()"매개변수 목록이 너무 깁니다"실수.

대신 제안된 솔루션은

seq 1 1000000 | xargs truncate -s 1k

시스템 호출 제한을 피하기 위해 필요한 만큼 의 인수( 를 제외하고 각 호출 에서 반복)를 실행 truncate(전달 )하면 됩니다.xargstruncate-s1kexecve()

관련 정보