큰 파일을 자르는 Unix 쉘 스크립트


87

3GB의 공간에 도달하면 응용 프로그램에 의해 지속적으로 작성 / 열리는 파일을 자르거나 비우는 Unix 스크립트를 작성하려고합니다. 나는 아래 명령이 그것을 할 것이라는 것을 알고 있습니다.

cp /dev/null [filename]

그러나 나는 이것을 cron 작업으로 프로덕션 환경에서 자동으로 실행할 것입니다. 여기에 게시하여 이와 유사한 작업을 수행하는 동안 문제가 발생했는지 확인하십시오.


이것들은 찌르다. 로그에 가치가 없습니까? 1 년 이상 (bzip2 -9 fmt로) 프로덕션 로그를 보관할 수있어서 운이 좋았고 작업 실행 시간을 쉽게 추출하고 처리 된 레코드를 만들 수있는 몇 가지 작은 유틸리티가 있었으며 스프레드 시트에로드 할 때 계산 및로드 비율 그래프 화가 쉬웠습니다. 그리고 많은 것들. 부하 비율이 낮아져 hdwr 문제를 발견했습니다. 예, 멋진 모니터링 도구가 있으므로 모두 상황에 따라 다릅니다. 별도의 옵션으로을 (를) 보셨나요? logrotate값을 제공 할 수 있습니다 (하지만 설정 (추측)하는 데 짜증이납니다!).
shellter

5
로그 파일이 O_APPEND 플래그와 함께 열리면 잘림이 적용됩니다. O_APPEND 플래그로 열리지 않으면 프로그램은 오프셋 3GiB (처음)에서 계속 기록합니다. 시스템은 처음 3GiB를 모두 0 바이트 (잘 압축 됨)로 처리하지만 파일은 계속 증가합니다. 그것은 모두 로그를 작성하는 프로그램에 달려 있습니다.
Jonathan Leffler

답변:


116

다른 답변을 추가하기 위해

: > filename

: bash (POSIX 호환)에서 작동하지 않으므로 본질적으로 쓰기 위해 파일을 열고 (물론 파일을 자른 다음) 즉시 닫습니다.

편집 : 쉘터가 언급했듯이 실제로 리디렉션과 함께 이동하는 명령이 필요하지 않습니다.

$ echo foo > foo.txt
$ cat foo.txt
foo
$ > foo.txt
$ cat foo.txt
$

단순한 리디렉션만으로도 파일이 지워집니다.


25
또는 그냥 > filename(당신이 아는 것처럼). 모두에게 행운을 빕니다.
shellter

5
@shelter "$> file"은 POSIX가 아니고 휴대용이 아닙니다. 처음 제안 된대로 리디렉션하기 전에 ":"no-op 명령을 사용해야합니다.
Aaron Toponce 2013

2
+ 플러스 웃는 얼굴
크리스 Suszyński

2
@AaronToponce가 지적했듯이 "$> file"은 실제로 이식성이 없습니다. 내 Zsh 설정에서 쉘이 중단됩니다 (입력 대기 중). "$ :> file"은 Zsh에서 잘 작동합니다.
Linus Arver 2016

1
@TechEnthusiast 그것은 당신의 기대에 달려 있습니다. 잘림 자체는 원자 적이지만 특정 쓰기와 관련하여 언제 발생할지 실제로 알 수 없습니다. 예를 들어 파일 시작 부분에 부분 줄이 표시 될 수 있습니다.
chepner

65

데비안에서 다음 명령을 사용했습니다.

truncate -s 0 filename

@SteveClay : sudo sh -c ': > filename'또한 자릅니다filename
Perleone

2
OPS 제안도 함께 완벽하게 작동 @SteveClay sudo: sudo cp /dev/null filename. 또한 cp동안 휴대용 truncate현대 리눅스 전용입니다.
Tino

11

그것은 나에게 합리적인 것 같습니다. 물론 유닉스에서는 약 50 가지 다른 방법으로이를 수행 할 수 있습니다. 예를 들면

echo -n "" >filename
cat /dev/null >filename

2

trunc filename

UNIX의 AIX 풍미에서 작동

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