텍스트 파일의 내용 비우기


16

cron 작업을 통해 정기적으로 데이터를 수신하는 텍스트 파일이 홈 디렉토리에 있습니다. cron 작업은 동적 데이터를 제공하기 때문에 파일 내용을 비우도록 cron 작업을 설정하려고합니다 (파일이 여전히 존재해야 함). cron에 대한 도움이 필요하지 않습니다. 파일을 비우는 데 도움이되는 명령 만 있습니다.


5
대안 : tail -n +1000 file.txt > file.txt1000 줄을 제거하고 파일에 최신 줄을 유지해야합니다 (무엇을 추적하기 위해 최근 레코드가 필요한지 알 수 없음).
Rinzwind

2
실제로 예약 된 시간에 파일을 지우는 것보다 더 나은 옵션입니다.
Bruno Pereira

1
@Rinzwind, 꼬리가 파일을 읽으려고 시도하기 전에 파일이 잘 리므로 작동하지 않습니다. 새 파일로 리디렉션 한 다음 원본을 새 파일로 바꿔야합니다.
psusi

True @psusi :) 추가 리디렉션이 필요합니다.
Rinzwind

답변:


28

가장 간단한 방법 :

> filename

이것은 덜 명백한 방법이며 다른 사람들이 쉘 스크립트에서 읽을 수 없을 수도 있지만 필요한 전부입니다.

>실제로는 실제로 명령이 아니기 때문에 (bash 내장) 다음을 사용할 수 없습니다.

sudo > filename

해당 파일에 대한 권한이없는 경우 그러나 당신은 사용할 수 있습니다 :

sudo bash -c "> filename"

권한이 거부
되었다고 말해서

@sosytee 새 편집 내용을 확인하십시오.
Radu Rădeanu

1
@sosytee 물론 가능하지만 sudo crontab -eroot가 아닌 cron 작업을 추가하는 데 사용 하십시오. 또는 파일 권한을 755가 아닌 766 (또는 666)으로 변경하십시오 sudo chmod 766 filename. 상세 정보 : codex.wordpress.org/Changing_File_Permissions
라두 Rădeanu

1
truncate filename빈 출력을 파일로 리디렉션하는 것보다 약간 깨끗하고 간단하며와 관련된 문제가 발생하지 않습니다 sudo.
psusi

1
@psusi는 truncate -s 0 filename실제로 트릭을 만들 수 있습니다. 답변으로 추가 할 수 있습니다.
Radu Rădeanu

19

이를 위해 만들어진 도구가 있습니다.

truncate -s 0 filename

그러면 내용이 지워지지 만 여전히 같은 파일이됩니다 ( 아이 노드 는 동일하게 유지됨 ).

일부 프로그램은 "inode로"파일에 대한 핸들을 보유하기 때문에 중요합니다. 파일을 삭제하고 다시 작성하는 순진한 방법을 사용하여 파일을 "비운"다고 가정하십시오. 일부 프로그램은과 같은 일반적인 방법으로 더 이상 표시되지 않더라도 이전 파일 (이전 내용 포함)에 대한 핸들을 계속 보유 할 수 있습니다 ls.

이 답변의 끝에 자세한 내용으로 연결되는 링크가 있습니다.


다른 방법으로는 기억하기 쉬울 것입니다.

echo -n > filename

이것은 또한 동일한 inode를 유지합니다.

그 모두를 참고 truncate하고 echo -n의해 정의되지 않은 POSIX .

POSIX 준수 사용 cat /dev/null:

cat /dev/null > filename

또 다른 방법으로, 더 모호하고 아마도 껍질에 구애받지 않을 것입니다.

> filename

자를 파일에 쓰기 위해 루트 권한이 필요한 경우 다음 줄이 예상대로 작동하지 않습니다.

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

sudo가 실행되기 전에 셸에서 리디렉션을 수행하기 때문입니다. 즉, 파일에 대한 쓰기 액세스는 sudo에 의해 부여 된 권한이 아니라 쉘을 실행하는 사용자의 권한을 사용하여 수행됩니다.

해결 방법은 다음과 같이 sudo 권한을 사용하여 실행 된 쉘로 리디렉션을 연기하는 것입니다.

sudo sh -c "echo -n > filename"

사용하여 truncate사용자가 쓰기 권한이 쉘에 의해 수행되지 않기 때문에 이러한 해결 방법을 필요로하지 않지만로 truncate하는 sudo는 권한을 사용하여 sudo는에 의해 실행된다.

sudo truncate -s 0 filename

파일이 삭제 된 경우에도 파일을 열린 상태로 유지하는 프로그램에 대한 자세한 내용은 다음을 읽을 수 있습니다.


이 권한은 chmod를 755 파일 이름을 사용했다가 거부 여전히 권한이 거부하고 있다고
sosytee

2
아마도 bash에서 noclobber가 활성화되어 있습니까?
lesmana

지금까지 가장 완벽한 답변
AbdelHady

4

이를 자동화하기 위해 logrotate를 사용할 수 있습니다. 비 우려는 파일의 구성 파일을 만들고 다른 설정을 추가하면 매일 선택한 기준에 따라 또는 파일이 더 큰 경우 등을 기준으로 매일 자동으로 비울 수 있습니다.

logrotate를 구성하는 방법을 여기에서 살펴보십시오 : http://linuxcommand.org/man_pages/logrotate8.html


1
이 옵션을 선호합니다. "file> 10 Mb"-> "tar.gz it to backup" "빈 파일"을 사용합니다. 그리고 백업은 900 일 후에 삭제됩니다.
Rinzwind

3

echo "" > foo_file, 그것의 모든 내용 그 일을하는 간단한 방법을 대체한다 foo_file을 함께 "" 이 경우에 그것을 만들기, 비 웁니다.

cat /dev/null > foo_filenull 장치를 읽고 파일을 전혀 덮어 쓰지 않는을 사용할 수도 있습니다 .


이 권한은 chmod를 755 파일 이름을 사용했다가 거부 여전히 권한이 거부하고 있다고
sosytee

일반 사용자와 함께 파일 권한을 읽을 수 있습니까?
Bruno Pereira

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