명령 줄에서 파일을 줄이려면 어떻게해야합니까?


9

150GB xml 파일을 사용하여 약 1GB로 줄이려고합니다 (예 : 자르기)-사용할 수있는 간단한 (bash 또는 이와 유사한) 명령이 있습니까, 또는 프로그래밍 방식으로 이동해야합니까 (vi 또는 emacs에서 편집) 큰 철 시스템에도 악몽이 있습니까?)

(나는 정보 손실에 대해 특별히 걱정하지 않고 짧은 파일을 원하므로 소프트웨어를 테스트하고 많은 시간을 기다리지 않아도됩니다. 파일이 짧을수록 그렇게 할 수 있습니다.)


1
파일을 자르시겠습니까, 아니면 파일 전체에서 정보를 제거 하시겠습니까?
AFH

1
SO에서 이것을 찾았습니다. stackoverflow.com/a/15934078/2800918 .
CAB

2
이 파일은 많은 수의 요소가있는 시퀀스를 포함한다고 가정하는 XML 파일이므로 XQuery와 같은 XML 변환 언어를 사용하여 특정 수의 이러한 요소를 필터링하여 유효한 XML을 출력하는 이점이 있습니다 ( )
Aaron

4
완료시 파일이 여전히 유효한 XML이어야합니까?
Joe

1
아니, 난 그냥 그것을 패치 그래서 그것은
adrianmcmenamin

답변:


15

150GB 파일의 첫 1GB를 자르고 추출한다고 가정합니다.

head:

head -c 1G infile > outfile

점을 유의 G접미사로 대체 할 수있다 GB1000 대신 1024 정렬합니다.

또는과 dd:

dd if=infile of=outfile bs=1M count=1024

또는 Wumpus Q. Wumbley의 답변 dd에서와 같이 제자리에서 잘릴 수 있습니다.


5
완료되면 읽을 수있는 XML 파일이 생성되지 않을 수 있습니다.
Joe

3
@Joe-OP는 읽을 수있는 파일을 요청하지 않았습니다 (읽을 수 없다고 말하지도 않았습니다). 그들은 정보 손실에 관심이 없다고 말했습니다. OP에서 해당 파일을 수정하는 방법에 대한 새로운 질문을 기대합니다.
KevinDTimm

3
XML을 수정하기에 충분한 XML을 알고 있으며 형식에 대한 DTD를 작성했습니다!
adrianmcmenamin

37

파일을 1 기가 바이트로 자르려면 다음 truncate명령을 사용하십시오 .

truncate -s 1G file.xml

잘림의 결과는 유효한 XML 파일이 아닐 수 있지만, 이해하신 것으로 확인합니다.

GNU 버전에 대한 설명서 truncate여기 에 있으며 BSD 버전에 대한 설명서는 여기에 있습니다


14

가능한 경우 truncateJohn1024의 답변과 같이 명령을 사용합니다 . 그러나 표준 유닉스 명령이 아니므로 언젠가는 그것을 사용할 수 없다는 것을 알게 될 것입니다. 이 경우 dd내부 잘라내기도 수행 할 수 있습니다.

dd의 기본 동작은 복사가 끝나는 지점에서 출력 파일을 자르는 것이므로 0 길이의 입력 파일을 지정하고 원하는 자르기 지점에서 쓰기 시작하도록 지시하십시오.

dd if=/dev/null of=filename bs=1048576 seek=1024

( ddmultithr3at3d의 답변에서 복사 및 자르기와는 다릅니다 .)

1048576 * 1024가 원하는 크기이므로 1048576 및 1024를 사용했습니다. 이것은 "휴대 성"대답, 그리고 고전 때문에 학사 = 1m를 피해야 dd만 접미사를 알고 k, b하고 w.


2
일반적인 솔루션의 경우 bs숫자에 곱한 seek숫자는 유지해야 할 바이트 수입니다. 해당 제약 조건을 만족하는 두 숫자는 모두 작동해야합니다. 예를 들어, bs=1073741824 seek=1또는 bs=1 seek=1073741824. 또는 bs기본값이 512이므로 seek=2097152단독으로도 작동합니다. 그리고 당신은 같은 표기법을 사용할 수 있습니다 1M, 1K, 1G2M.
G-Man, 'Reinstate

1

나는 당신이 무엇을 요구하는지 완전히 확신하지 못합니다. 다른 149GB를 제거하거나 150GB를 1GB로 압축하려고합니까? 그럼에도 불구하고 이것은 이것을 달성하는 데 유용한 방법 일 수 있습니다.

split명령은 모든 파일을 여러 조각으로 나눌 수 있습니다. man split을 참조하십시오 . -b옵션 을 사용하여 분할하려는 파일 청크의 크기를 지정할 수 있습니다 . 예를 들어 :

$ split -b 1GB myfile.xml

다른 옵션이 없으면 문자로 시작하여 현재 디렉토리에 여러 파일을 작성해야합니다 x. 분할 파일의 이름을 조정하려면 매뉴얼 페이지를 참조하십시오.

파일을 다시 조립하려면을 사용하십시오 cat * > re-assembled.xml.

예:

[kent_x86.py@c7 split-test]$ ls -l opendocman*
-rw-rw-r--.  1 kent_x86.py kent_x86.py 2082602 Mar 31  2017 opendocman-1.3.5.tar.gz

[kent_x86.py@c7 split-test]$ split -b 100K opendocman-1.3.5.tar.gz 
[kent_x86.py@c7 split-test]$ ls
opendocman-1.3.5.tar.gz  xaa  xab  xac  xad  xae  xaf  xag  xah  xai  xaj  xak  xal  xam  xan  xao  xap  xaq  xar  xas  xat  xau
[kent_x86.py@c7 split-test]$ ll
total 4072
-rw-rw-r--. 1 kent_x86.py kent_x86.py 2082602 Jan  5 11:06 opendocman-1.3.5.tar.gz
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaa
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xab
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xac
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xad
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xae
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaf
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xag
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xah
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xai
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaj
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xak
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xal
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xam
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xan
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xao
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xap
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaq
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xar
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xas
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xat
-rw-rw-r--. 1 kent_x86.py kent_x86.py   34602 Jan  5 11:06 xau
[kent_x86.py@c7 split-test]$ cat xa* > opendoc-reassembled.tar.gz
[kent_x86.py@c7 split-test]$ ls -l opendoc-reassembled*
-rw-rw-r--. 1 kent_x86.py kent_x86.py 2082602 Jan  5 11:07 opendoc-reassembled.tar.gz


0

결국 나는 sed임의의 수의 줄을 추출하는 데 사용 했습니다.

sed -n 1,1000000p infile.xml>outfile.xml

1
이것이 질문에 대한 대답인지 아닌지를 제쳐두고, 이것은 전체 파일을 스캔 할 것이기 때문에 사용하는 것이 훨씬 효율적입니다 sed 1000000q(그리고 조금 더 작고 시각적으로 말하기).
B 레이어
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.