UNIX에서 큰 파일을 만드는 방법은 무엇입니까?


17

Windows에서 그런 일을하는 방법을 찾았습니다.

echo "This is just a sample line appended  to create a big file. " > dummy.txt
for /L %i in (1,1,21) do type dummy.txt >> dummy.txt

http://www.windows-commandline.com/how-to-create-large-dummy-file/

UNIX에서 파일을 복사하고 프로세스를 추가 한 다음 반복하는 방법이 있습니까? 같은 것 for .. cat file1.txt > file1.txt?


추가하는 대신 파일을 복사하고 추가하는 이유는 무엇입니까?
123

@ 123 append가 좋지만 루프를 수행하는 방법은 무엇입니까?
Thomas Lee

4
for i in {1..1000000};do echo "string" >> file;donebash에서.
123

9
텍스트 파일이어야합니까? / dev / zero 또는 / dev / urandom에서 모든 크기의 파일을 만들 수 있습니다.
RealSkeptic

2
나는 type file >> file무한 루프에서 실행될 것으로 기대 합니다 (적어도 버퍼에 맞지 않을 정도로 충분히 커지면).
Stéphane Chazelas

답변:


29
yes "Some text" | head -n 100000 > large-file

csh/ tcsh:

repeat 10000 echo some test > large-file

zsh:

{repeat 10000 echo some test} > large-file

GNU 시스템에서 다음을 참조하십시오.

seq 100000 > large-file

또는:

truncate -s 10T large-file

(10TiB 스파 스 파일 (매우 크지 만 디스크의 공간을 차지하지 않음)을 작성 함) 및 "0 바이트가 많은 테스트 파일 작성" 에서 논의 된 다른 대안 .


이렇게하면 cat file >> file나쁜 생각 일 것이다.

첫째, cat출력 파일과 동일한 파일을 읽는 것을 거부하는 일부 구현 에서는 작동하지 않습니다 . 당신이 수행하여 해결도하지만 cat file | cat >> file, 경우는 file보다 큰 cat원인이 그 '의 내부 버퍼 cat가가 이전에 쓴하는 데이터를 읽는 끝날 것 같은 무한 루프를 실행합니다.

회전식 하드 드라이브가 지원하는 파일 시스템에서는 드라이브가 데이터를 읽는 위치 사이에서 앞뒤로 이동해야하기 때문에 (메모리에 캐시 될 수있는 것보다 큰 크기에 도달 한 후) 상당히 비효율적입니다. 그리고 그것을 쓸 곳.


19
또는 dd if=/dev/zero of=large-file bs=1024 count=10241MB 파일
doneal24

7
@ DougO'Neal dd if=/dev/zero of=test bs=1M count=1더 명확 해졌습니다.
123


1
또는 임의의 데이터를 원하면 / dev / zero 대신 / dev / urandom을 사용하십시오.
user253751

3
@ robertotomás 예, 모두가 사용 dd하지만 이유를 이해하지 못했습니다. 실제로 MBR 또는 이와 유사한 프린지 작업을 읽는 데만 사용한 것 같습니다. 내 경험상 다른 도구는 사람들이 사용하는 대다수의 경우 더 빠르고 간단하며 안전합니다 dd. 나는 이것이 일반적인! = 최적, sudo su또는 같은 경우 중 하나라고 생각합니다 cat file | grep foo.
terdon

22

다음을 사용하여 Solaris에서 큰 파일을 작성할 수 있습니다.

mkfile 10g /path/to/file

Solaris (및 Linux)에서 작동하는 다른 방법 :

truncate -s 10g /path/to file

다음을 사용할 수도 있습니다.

dd if=/dev/zero of=/path/to/file bs=1048576 count=10240

dd는 테라 바이트와 같습니다
123

1
"큰 파일"을 정의하십시오 :-) 그러나 다른 샘플은 모두 10g 상태이므로 편집했습니다 ...
Lambert

truncate 'truncate'를 실행할 수 없습니다. 그러한 파일 또는 디렉토리 Truncate는 Linux 전용이 아닙니다.
schily

truncateSolaris 11.2 이상에 존재
Lambert

11

Linux 시스템에서 큰 파일을 만드는 가장 빠른 방법은 fallocate다음과 같습니다.

sudo fallocate -l 2G bigfile

fallocate파일 시스템을 조작하고 실제로 기본적으로 데이터 섹터에 쓰지 않으므로 매우 빠릅니다. 단점은 루트로 실행해야한다는 것입니다.

루프에서 연속적으로 실행하면 몇 초 만에 가장 큰 파일 시스템을 채울 수 있습니다.

에서 man fallocate

fallocate는 파일을 할당 해제하거나 사전 할당하기 위해 파일에 할당 된 디스크 공간을 조작하는 데 사용됩니다.
fallocate 시스템 호출을 지원하는 파일 시스템의 경우 블록을 할당하고 초기화되지 않은 것으로 표시하여 데이터 블록에 대한 IO가 필요하지 않으므로 사전 할당이 신속하게 수행됩니다. 파일을 0으로 채워 파일을 만드는 것보다 훨씬 빠릅니다.
XFS (Linux 2.6.38부터), ext4 (Linux 3.0부터), Btrfs (Linux 3.7부터) 및 tmpfs (Linux 3.5부터)에서 지원됩니다.


1
이것이 정답입니다. 쉽고 빠릅니다.
ardochhigh

8

이것은 CTRL-C까지 계속 진행됩니다.

yes This is stuff that I want to put into my file... >> dummy.txt

그러나 초당 수십만 줄을 얻을 수 있기 때문에 조심하십시오 ...

보낸 사람 man yes:

yes - output a string repeatedly until killed

이것은 리눅스 환경에서 큰 파일을 만드는 매우 쉬운 방법입니다.
Chaminda Bandara

1
yes $BIG_STRING | head -c $TARGET_SIZE >> dummy.txt정확한 금액을 얻을 수 있습니다. (-n $ TARGET_NUMBER_OF_LINES). 대상 번호에 도달하여 종료 yes되면 '파손 된 파이프'의 결과로 자동으로 사망 head합니다.
PypeBros

4

내가 당신을 올바르게 이해하면, 당신은 다음과 같은 것을 찾고 있습니다 :

echo "test line" > file;
for i in {1..21}; do echo "test line" >> file; done

그러면 22 번의 "테스트 라인"이 반복되는 파일이 생성됩니다. 특정 파일 크기를 원하면 다음과 같이 사용할 수 있습니다 (Linux). 1024는 1 킬로바이트입니다.

while [ $(stat -c "%s" file) -le 1024 ]; do echo "test line" >> file; done

개인적으로 큰 파일을 만들려면 두 개의 파일을 사용하고 하나는 다른 파일로 만듭니다. 원하는 크기 (1MB)에 도달 할 때까지 프로세스를 반복 할 수 있습니다.

echo "test line" > file;
while [ $(stat -c "%s" file) -le 1048576 ]; do 
    cat file >> newfile
    cat newfile >> file
done

파일이 제한 미만이면 모든 것이 다시 적용되기 때문에이 솔루션은 종종 원하는 크기를 초과합니다.

마지막으로 원하는 크기의 파일이 원하는 크기의 파일이고 실제로 포함 할 필요가없는 경우 다음을 사용하십시오 truncate.

truncate -s 1M file

1
합니까 cat파일이 실제로 불과하지만 추가로 어떤 장점을 가지고 보내고? 루프마다 두 개의 프로세스를 포크하고 전체 내용을 여러 번 이동해야하므로 시간이 더 걸리는 것처럼 보입니다.
123

1
@ 123 속도. cat접근 방식은 훨씬 더 빨리, 많이. 거대한 파일을 만드는 데만 의미가 있지만 내 컴퓨터에서 10 초 안에 545M 파일을 만들었습니다. 동일한 while루프가 echo "test line" >> file같은 시간에 96K 파일 을 만들었습니다.
terdon

"고양이"접근 방식은 기하 급수적으로 증가한다는 것입니다. 두 번째 반복을 시작할 때 'newfile'에는 이미 한 줄이 있고 'file'에는 2가 있으며, 완료되면 'newfile'은 이제 3 줄이고 'file'은 5입니다. 다음으로 'newfile'은 8이되고 ' 파일은 13입니다. 다음 (21, 34) 등
PypeBros

단점 : 파일을 작성하는 동안 대상 파일 크기보다 많은 디스크 공간 (> = 1.5 * desired_size)이 필요할 수 있습니다.
PypeBros

btw. truncate주위에 있다면 truncate -s 1G먼저 파일을 만들 수 있습니다 . unix.stackexchange.com/a/269184/85549 . 루프 head -c $DESIRED_SIZE내에서을 대체 할 수 있습니다 while.
PypeBros

3

의 내용 배관으로 /dev/urandom로를 head그렇게, 출력을 파일로 리디렉션 할 수 있습니다 :

 cat /dev/urandom | head --bytes=100 >> foo.bar

100 바이트의 가비지가있는 파일을 제공합니다.


1
echo "This is just a sample line appended  to create a big file. " > dummy.txt
i=1
while [ $i -le 21 ]
do
  cat dummy.txt >> bigfile
  cat bigfile > dummy.txt
  (( i++ ))
done

Windows 스크립트와 동일한 효과이지만 bash에서는 파일을 직접 연결할 수 없습니다.


.txt확장명 을 잊어 버리는 것 외에도 마지막에 두 개의 큰 파일을 남겨 둡니다.
ott--
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.