리눅스에서 파일을 주어진 크기로 자르는 방법?


19

나는 무차별 대입으로 파일 크기를 축소하고 싶습니다. 즉, 나머지는 신경 쓰지 않고 파일을 반으로 자르고 나머지는 버리고 싶습니다.

가장 먼저 떠오르는 것은 Perl의 truncate 입니다. 해당 페이지의 예제를 따르고 있으며 정확히 동일한 작업을 수행했습니다.

seq 9 > test.txt
ls -l test.txt
perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'

그러나 파일 크기는 여전히 같습니다.

$ ls -lgG test.txt
-rw-rw---- 1 18 2013-08-08 09:49 test.txt

이 작업을 어떻게 수행 할 수 있습니까?

답변:


62

truncate 명령 을 사용할 수 있습니다 .

truncate --size=1G test.txt

SIZE는 바이트, KB, K, MB, M 등으로 지정할 수 있습니다. 원하는 크기를 직접 계산할 수 있다고 가정합니다. 그렇지 않은 경우 stat 명령을 사용하여 파일의 현재 크기에 대한 정보를 얻을 수 있습니다.


coreutils 의 설명서 (정보 형식)
Cristian Ciupitu

21
perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'

읽을 파일을 엽니 다. 그러나 파일을 자르려면 파일을 수정해야하므로 읽기 전용 파일 핸들이 작동하지 않습니다. "수정"모드 ( "+>") 를 사용해야합니다 .

부수적 인 문제로 사람들이 시스템 호출을 자동으로 실패하게 한 다음 무엇이 잘못되었는지 물어 보면 항상 놀랍습니다. 문제 진단 의 필수 부분은 생성 된 오류 메시지를 보는 것입니다. 이해가 안 되더라도 도움을 요청하는 사람들이 훨씬 쉽게 생활 할 수 있습니다.

다음은 다소 도움이되었을 것입니다.

perl -we 'open(FILE, "<", "./test.txt") or die "open: $!";
          truncate(FILE, 8) or die "truncate: $!";
          close(FILE);'

물론 "잘못된 인수"만보고했을 것입니다. 여전히 유용한 정보이며 개방 모드가 잘못되었다는 결론을 내릴 수도 있습니다.


3

tail마지막 100000 바이트를 자르는 데 사용할 수 있습니다 ( 예 :

꼬리 -c 100000 파일> file2

-c는 추가 옵션을 위해 파일의 최종 100000 바이트를 출력합니다.

남자 꼬리

원본 파일을 방금 생성 한 파일로 바꾸려면

mv file2 파일


2

잘림을 인용하는 위의 대답 은 훌륭합니다. dd 도 작업을 수행합니다.

dd if=test.txt of=test2.txt bs=1 count=8
mv test2.txt test.txt

1
핵심 문구는 "주어진 크기로"( 1000)입니다. 대신에 가장 많이 투표 된 답변으로 변경하겠습니다. 즉석 입력에 작동합니다. 중간 파일이 필요하지 않습니다.
xpt

0

ed 프로그램을 사용하여 bash를 사용하여 완전히 다른 방법이 있습니다. 다음 스크립트는 지정된 디렉토리에있는 모든 파일의 마지막 5000 줄만 유지합니다. 이것은 여러 디렉토리를 반복하고 행 수를 변경하는 등의 작업을 쉽게 수정할 수 있습니다.

#!/bin/bash

LOGDIR=/opt/log
SAVELINES=5000

dirs="$LOGDIR"
for dir in $dirs ; do
    files=${dir}/*
    for f in $files ; do
        echo -e "1,-${SAVELINES}d\nwq" | ed $f 1>/dev/null 2>&1
    done
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.