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
입력은 기본적으로 공백으로 분할되지만 여기서는 중요하지 않습니다.)
위의 코드는 많은 메모리를 사용할 수 있으므로 seq
mosvy의 설명과 같이 사용하는 것이 더 나을 수 있습니다.
seq 1 1000000 | xargs truncate -s 1k
그러나 나는 일반적으로 루프를 사용합니다(이것은 000000
not 으로 시작 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]
-s
1k
execve()
"매개변수 목록이 너무 깁니다"실수.
대신 제안된 솔루션은
seq 1 1000000 | xargs truncate -s 1k
시스템 호출 제한을 피하기 위해 필요한 만큼 의 인수( 를 제외하고 각 호출 에서 반복)를 실행 truncate
(전달 )하면 됩니다.xargs
truncate
-s
1k
execve()