터미널에서 단어 세트를 무한 반복하는 파일을 만드는 방법은 무엇입니까?


19

터미널에서 단어 세트를 무한 반복하는 파일을 만드는 방법은 무엇입니까? 2-4GB 크기의 파싱 목적으로 큰 파일을 만들려면 필요합니다. 현재 크기를 늘리기 위해 붙여 넣기 행을 동일한 파일에 수동으로 복사하고 있습니다.


1
특수 유닉스 파일로 작업하는 답변을보고 싶습니다. 실제로 그 공간을 차지하지는 않습니다. 가능합니까?
Délisson Junio

1
당신은 정말 무한한 것을 의미 mkfifo huge.tmp; while true; do yes "a dummy line" > huge.tmp; done합니까?
Boldewyn

답변:


50

한 줄을 여러 번 반복하는 쉬운 방법이 있습니다.

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

2
OP는 줄이 아닌 바이트를 처리하려고합니다.
heemayl

4
바이트 단위로 제한을 지정하려면 10k 라인 head -c 10000대신 10kB를 사용하십시오 head -n 10000.
바이트 사령관

@ByteCommander는 그렇습니다. 그러나 라인 중간에서 출력이 차단되는 것은 아닙니다. 크기가 정확할 필요는 없으므로 올바른 크기를 얻기 위해 줄 수를 알아 내고 반올림합니다. :)
hobbs

1
동의하지만, 그것이 문제가 될지 확실하지 않습니다. OP는 원하는 방법을 지정하지 않았지만 귀하의 답변에는 여전히 두 가지가 모두 포함되어 있습니다. 아, 그리고 오늘 당신의 명성 점수를 두 배로 높이 축하합니다 :)
바이트 사령관

@ByteCommander 그렇습니다.
hobbs

10

무한 반복 텍스트를 추천 할 수는 없지만 파이썬으로 ~ 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이 부족합니다 ...

그래도 토스터를 타요


OP는 줄이 아닌 바이트를 처리하려고합니다.
heemayl

@heemayl 물론 대답은 더 낫지 만 원하는 바이트를 얻는 데 사용할 줄 수를 계산하는 방법을 모호하게 설명 했으므로 대답이 전혀 쓸모가 없다고 생각합니다.
Zanna

4
@heemayl OP가 바이트를 원하는 이유는 무엇입니까? 문제는 본질적으로 OP가 큰 파일을 원한다는 것을 나타냅니다. 특정 크기는 매우 모호하므로 (2-4GB) 특정 바이트 제한이 있는지 의심합니다.
terdon

1
@heemayl 네, 그러나 그것은 매우 모호합니다. 내 이해는 OP가 큰 파일을 원하고 정확한 크기를 신경 쓰지 않는다는 것입니다. 그렇지 않으면, 그들은 거대한 크기 범위 대신 크기를 부여했을 것입니다.
terdon

1
@ 캣 아이크! <3python <3
ZANNA

9

펄에는 멋진 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

인내심이 있다면, Perl 6이 훨씬 느리고 훨씬 느리다는 점을 제외하고 멋진 Perl 6 연산자를 사용할 수 있습니다. : D
cat

@ 고양이 정말입니까? 나는 전혀 6을 건드리지 않았지만, 단지 모든 선한 장점과 OO 엑스트라를 모두 가지고 있다고 가정했습니다. 왜 느린 지 아십니까?
terdon

1
내 의견은 대부분 입심했지만, 나는 발견 펄 6 canonically 훨씬 낮은 속도 (I 테스트하지 않았다) 펄 5보다 파이썬 3에 비해 매우 낮다는 올해의 시작 부분에. 작업은 아직 성능이 아니라 기능과 정확성에 중점을 두었지만 2015 년의 목표로 선정되었습니다. 또한 Perl 6은 충분히 빠릅니까? .
고양이

(반면에, 기능 목록은 가장 적은 것이 인상적 입니다.)
cat

7
  • 반복 할 단어 세트를 파일에 넣으십시오 (예 :) source.txt. source.txt바이트 단위 의 크기를 가져옵니다 ( 예 :

     stat -c '%s' source.txt
    
  • 대상 파일의 크기를 결정하십시오 (예 : destination.txt2GB 또는 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시간이 덜 걸립니다.


1
destination.txt루프가 반복 될 때마다 한 번 열리고 닫히지 않습니까?
복원 모니카-ζ--

@hexafraction Duh, 고정.
heemayl

6

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

4

먼저 명령을 실행하십시오.

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)

2
OP는 줄이 아닌 바이트를 처리하려고합니다.
heemayl

OP는 또한 파일을 채우는 데 계속 대처하고있다. 그리고 첫 번째 명령은 필요한 메모리 바이트 당 이미 파일을 만들었습니다.
Avani badheka

@heemayl 개행 문자는 여전히 이전 주석과 같은 바이트를 차지합니다. 합법적 인 캐릭터입니다. 그러나 OP는 Avani 라는 단어를 지정 했으므로 / dev / urandom 기술이 그들의 질문에 대답하지 않는다고 생각합니다.
Mike S

임의의 바이트를 시도하는지 여부에 따라 / dev / urandom에 따라 달라집니다. 많은 양의 데이터가 포함 된 파일을 직접 선택할 수도 있습니다.
Avani badheka

4

FIFO는 아마도 당신이 찾고있는 것일 것입니다. 주어진 파일로 프로그램을 호출하는 대신 프로세스 대체 를 통해 쉘 명령의 결과를 묶을 수 있으며 프로그램은 출력을 일반 텍스트 파일로 보게됩니다. 여기서 장점은 더 이상 디스크 공간에 의해 제한되지 않으므로 프로그램이 전체 파일을 먼저 버퍼링 할 필요가없고 한 줄씩 구문 분석 할 수있는 한, 그렇지 않으면 불가능한 파일 크기에 도달 할 수 있다는 것입니다. 예를 들어 @hobbs 'reply를 사용하여 컨텐츠를 생성하십시오.

wc -c <(yes we have no bananas | head -n 5000000000)

이것은 나에게 95GB의 파일을 (wc에 따라) HDD 공간과 거의 모든 RAM에서 무료로 빌려줍니다. 이것은 당신이 얻는 것처럼 "무한"에 가깝습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.