터미널에서 단어 세트를 무한 반복하는 파일을 만드는 방법은 무엇입니까? 2-4GB 크기의 파싱 목적으로 큰 파일을 만들려면 필요합니다. 현재 크기를 늘리기 위해 붙여 넣기 행을 동일한 파일에 수동으로 복사하고 있습니다.
mkfifo huge.tmp; while true; do yes "a dummy line" > huge.tmp; done
합니까?
터미널에서 단어 세트를 무한 반복하는 파일을 만드는 방법은 무엇입니까? 2-4GB 크기의 파싱 목적으로 큰 파일을 만들려면 필요합니다. 현재 크기를 늘리기 위해 붙여 넣기 행을 동일한 파일에 수동으로 복사하고 있습니다.
mkfifo huge.tmp; while true; do yes "a dummy line" > huge.tmp; done
합니까?
답변:
한 줄을 여러 번 반복하는 쉬운 방법이 있습니다.
yes we have no bananas | head -n 10000 > out.txt
"우리는 바나나가 없습니다"라고 말하는 10,000 개의 줄을 포함하는 out.txt를 생성합니다.
출력을 정확한 바이트 수로 제한하려면 대신 head
의 -c
옵션을 사용하십시오 -n
. 예를 들어 정확히 10kB의 텍스트가 생성됩니다.
yes we have no bananas | head -c 10000 > out.txt
head -c 10000
대신 10kB를 사용하십시오 head -n 10000
.
무한 반복 텍스트를 추천 할 수는 없지만 파이썬으로 ~ 2GB의 반복 텍스트 파일을 만들 수 있습니다 ...
python3 -c 'with open("bigfile", "w") as f: f.write(("hello world "*10+"\n")*2*10**7)'
그러면 "hello world"가 10 번 인쇄되고 새로운 줄이 생겨 2 만 번 반복되어 결과가 파일에 기록됩니다 bigfile
. 모든 문자가 ASCII 인 경우 각 문자는 1 바이트이므로 작성하려는 내용에 따라 적절하게 계산하십시오 ...
CPU가 소유되었을 수 있습니다. 10,000,000 라인 이상을 시도하면 RAM이 부족합니다 ...
그래도 토스터를 타요
펄에는 멋진 x
연산자가 있습니다 :
$ perl -e 'print "foo\n" x 5'
foo
foo
foo
foo
foo
따라서 간단한 솔루션으로 라인을 몇 백만 번 쓸 수 있습니다. 예를 들어이 명령은 3G 파일을 생성했습니다.
perl -e 'print "This is my line\n" x 200000000' > file
정확한 크기 (이 경우 2GiB)를 지정해야하는 경우 다음을 수행 할 수 있습니다.
perl -e 'use bytes; while(length($str)<2<<20){ $str.="This is my line\n"} print "$str\n"' > file
반복 할 단어 세트를 파일에 넣으십시오 (예 :) source.txt
. source.txt
바이트 단위 의 크기를 가져옵니다 ( 예 :
stat -c '%s' source.txt
대상 파일의 크기를 결정하십시오 (예 : destination.txt
2GB 또는 4GB 등). 크기를 바이트 단위로 변환하십시오.
대상 파일 크기를 소스 파일 크기로 나눕니다. bash
부동 소수점 산술을 수행 할 수 없지만이 경우에는 필요하지 않습니다.
나누기 결과 시간에 작업 for
을 반복 하려면 구문을 사용하십시오 cat source.txt
. 이는 반복으로 얻을 수있는 대상 파일 크기와 가장 비슷합니다. 작업의 출력이에 저장됩니다 destination.txt
.
예를 들어, source.txt
가 30 바이트 라고 가정하고 2GB 파일을 만들려면 다음이 필요합니다.
for ((i=0; i<=((16777216/30)); i++)); do cat source.txt; done >destination.txt
((16777216/30))
초기화 시간에 의해 상한 을 설정하고 있습니다. 결과를 얻어 여기에 넣을 수도 있습니다.
작업에는 약간의 시간이 소요됩니다. 가 클수록 source.txt
시간이 덜 걸립니다.
destination.txt
루프가 반복 될 때마다 한 번 열리고 닫히지 않습니까?
while
-loop를 사용할 수도 있습니다 .
예 : 내용 foo.txt
(이것은 소스입니다) :
foo
bar
foobar
bar.txt
비어 있습니다 (대상 파일입니다). 이제 다음 루프를 제거하여 foo.txt
여러 번 내용을 쓸 수 있습니다 bar.txt
.
while [ $(stat --format "%s" bar.txt) -lt 150 ]
do
cat foo.txt >> bar.txt
done
설명:
stat --format "%s" bar.txt
크기를 bar.txt
바이트 단위로 표시합니다 .while [ $(stat --format "%s" bar.txt) -lt 150 ]
대상 크기 (이 경우 150 바이트)에 도달 할 때까지 다음 작업이 반복됩니다.cat foo.txt >> bar.txt
에 내용을 추가 foo.txt
하다bar.txt
먼저 명령을 실행하십시오.
dd if=/dev/urandom of=file.txt bs=2048 count=10
크기가 bs * count 임의 바이트 인 경로에 파일을 작성합니다 (이 경우 2048 * 10 = 20Kb). 요구 사항에 따라 변경할 수 있습니다.
cat - > file.txt
이 명령은 STDIN을 파일로 경로 재 지정하므로 두 행을 입력 한 후 Ctrl + D를 눌러야합니다. 그런 다음 다음 명령을 실행해야합니다.
for i in {1..n}; do cat file.txt file.txt > file2.txt && mv file2.txt file.txt; done
여기서 n은 정수입니다. 원래 두 줄을 복제하여 2 ^ (n + 1) 줄을 가진 파일을 만듭니다. 따라서 16 줄의 파일을 만들려면 다음을 수행하십시오.
for i in {1..3}; do cat file.txt file.txt > file2.txt && mv file2.txt file.txt; done
시작하기위한 몇 가지 숫자가 있습니다.
n=15 will give you 65536 lines (if the original two lines were 'hello' and 'world' the file will be 384Kb)
n=20 will give you 2097152 lines (12Mb file with 'hello' and 'world' as the two starting lines)
n=25 will give you 67108864 lines (384Mb file with 'hello' and 'world' as the two starting lines)
FIFO는 아마도 당신이 찾고있는 것일 것입니다. 주어진 파일로 프로그램을 호출하는 대신 프로세스 대체 를 통해 쉘 명령의 결과를 묶을 수 있으며 프로그램은 출력을 일반 텍스트 파일로 보게됩니다. 여기서 장점은 더 이상 디스크 공간에 의해 제한되지 않으므로 프로그램이 전체 파일을 먼저 버퍼링 할 필요가없고 한 줄씩 구문 분석 할 수있는 한, 그렇지 않으면 불가능한 파일 크기에 도달 할 수 있다는 것입니다. 예를 들어 @hobbs 'reply를 사용하여 컨텐츠를 생성하십시오.
wc -c <(yes we have no bananas | head -n 5000000000)
이것은 나에게 95GB의 파일을 (wc에 따라) HDD 공간과 거의 모든 RAM에서 무료로 빌려줍니다. 이것은 당신이 얻는 것처럼 "무한"에 가깝습니다.