Linux에서 이미 존재하고 보호되는 파일을 비우는 ( "자르기") 방법은 무엇입니까?


113

자주 잘라야하는 내 서버에 error.log라는 파일이 있습니다. 파일에 대한 rw 권한이 있습니다. vi에서 파일 열기> 모든 콘텐츠 삭제> 작업 저장 (분명히). 하지만 아래를 시도하면

cat /dev/null > error.log

나는 메시지를 받는다

File already exists.

분명히 실수로 파일을 덮어 쓰는 것을 방지하기 위해 서버에서 일종의 구성이 수행됩니다. 누구든지 단일 명령으로 파일을 "자르는"방법을 말할 수 있습니까?


2
보호되지 않은 파일의 경우 자르기 -s 0 파일이 작동합니다.
Pramod

답변:


158

당신은이 noclobber옵션을 설정합니다. 오류는 csh에서 발생한 것처럼 보이므로 다음을 수행합니다.

cat /dev/null >! file

내가 틀렸고 bash를 사용하고 있다면 다음을 수행해야합니다.

cat /dev/null >| file

bash에서는 다음과 같이 줄일 수도 있습니다.

>| file

쉘이 csh에 대해 맞습니다. 그걸 어떻게 알았 니?
Sumeet Pareek 2010 년

6
@Wikidkaka-오류 메시지를 기반으로합니다. 내 시스템의 csh는 비슷한 File exists오류를 제공하는 반면 bash는 매우 다른 cannot overwrite existing file오류를 제공합니다 .
R Samuel Klatchko 2010 년

6
@Jarmund-사용자가 noclobber를 설정했기 때문에 >file작동하지 않습니다.
R Samuel Klatchko 2013 년

> file과 의 차이점은 무엇입니까 >| file?

1
@Will- noclobber옵션을 설정 한 경우 기존 파일로의 리디렉션 시도가 실패합니다. 에서는 noclobber을 떠나기 동안 특정 재 지정에 무시하려면, 당신은 사용할 수 있습니다>|
R 사무엘 Klatchko

71

함수 자르기를 사용할 수도 있습니다.

$truncate -s0 yourfile

권한이 거부 된 경우 sudo를 사용하십시오.

$sudo truncate -s0 yourfile

도움말 / 매뉴얼 : man truncate

우분투 Linux에서 테스트 됨


1
truncate는 파일의 수정 시간도 건드리지 만 파일이 변경되지 않은 경우 "> file"은 건드리지 않습니다.
dsteinkopf

파일이 보유한 디스크 공간을 해제하지 않습니다. 처음에는 0 바이트를 표시합니다. 그러나 해당 파일에 무언가를 쓸 때 파일 크기는 = 자르기 전 + 새 데이터 크기입니다.
Aniket Kulkarni

48

이것은 파일 크기를 0으로 설정하기에 충분합니다.

> error.log

6
실제로, 이것은 noclobber에서 작동 하지 않습니다 (직접 테스트했습니다). 따라서이 경우 유효한 해결책이 아닙니다 ( "-bash : error.log : cannot overwrite existing file"); 위의 추천을 참조하십시오 ( "@Jarmund-사용자가 noclobber를 설정했기 때문에> 파일이 작동하지 않습니다."). 난 그냥 어떤 종류의 "지능형 사람들"이 ... 같은 upvote에 분명히 잘못된 답변 궁금하네요

9

저의 선배 동료는 다음과 같은 점을 인정합니다.

:> filename

이것은 로그 파일을 손상시키지 않으므로 예를 들어 syslog에서도 사용할 수 있습니다.


8
설명 해주십시오. 어떻게 작동합니까? 그 표기법은 무엇을하고 있습니까?
user31986

2
@ user31986 :은 효과가없는 명령 (거의 주석)이고, >평소와 같이 리디렉션이므로 아무 작업도 수행하지 않는 명령의 출력 부족을 파일로 리디렉션합니다. noclobber가 활성화되면 :>| filename(bash) 가 필요합니다 (그리고 :>! filenamecsh가 있다고 가정 하고 csh에서 가정합니다 :).
Rhubbarb

4

false | tee fileToTruncate

잘 작동 할 수 있습니다


그것은 단지 어리석은 일입니다. 또는 이것이 유용하다면 dd아무것도 출력하지 않는 것이 평범한 읽을 수있는 것보다 낫습니다 false.
tripleee 2011

2

sudo는 이후 작동하지 않습니다 리디렉션 > I 등, tee이 목적을 위해 명령

echo "" | sudo tee fileName

글쎄요, 실제로는 당신이 연결 한 질문과 여기 위에 설명 된 것처럼 그렇습니다. "sudo sh -c '> error.log'"...

대상 파일에 대한 권한에 따라 다르며 error.log이미 쓰기 가능한 경우 sudo가 필요하지 않습니다. 나는 다른 문제는 당신이 문자열 인수로 명령을 전달하는 생각 sh, 내가 그 내부적으로 처리하는 방법을 모르지만 그 복잡성 / 재 지정의 또 다른 계층입니다
sakhunzai

1
echo ""줄 바꿈을 추가 하기 때문에 실제로 파일이 잘리지 않습니다 . echo -n ""줄 바꿈을 억제하는 데 사용할 수 있습니다
Seb

0

누구나이 명령을 시도하여 Linux 시스템 에서 파일을자를 수 있습니다.

이것은 모든 형식에서 확실히 작동합니다.

truncate -s 0 file.txt

0

나는 이것을 좋아한다 : cp /dev/null file


-4

시도해 볼 수도 있습니다.

echo -n > /my/file


8
수많은 표로 답을 보셨나요? 그것을 읽고, noclobber당신의 대답이 전혀 의미가 없는지 스스로에게 물어보십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.