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.