명령 줄에서 파일 내용을 지우는 방법은 무엇입니까?


280

더 이상 필요없는 많은 것들이 들어있는 로그 파일이 있습니다. 내용을 지우고 싶습니다.

내용을 화면에 인쇄하는 방법을 알고 있습니다.

cat file.log

파일을 한 줄씩 편집하는 방법을 알고 있습니다.

nano file.log

그러나 한 번에 한 줄씩 삭제하고 싶지 않습니다. 파일을 손상시키지 않고 하나의 명령으로 수행 할 수있는 방법이 있습니까?

답변:


465

bash에서는

> filename

할 것이다.

이것은 빈 파일 filename 을 남길 것입니다 .

추신

sudo전화 가 필요한 경우 여기에 답변 된truncate 대로 사용 하십시오 .


57
이것은 아마도 컴퓨팅 역사상 가장
까다로운

7
반대로 @ Arekkusandaa.Irujasukin; 언급 한 바와 같이 bash쉘이나 예를 들어 cmd.exePowerShell이 ​​아닌 쉘로 사용하는 한 모든 버전의 Windows에서 제대로 작동 합니다 .
DopeGhoti

124

사용자 명령을 사용할 수 있습니다 : 잘라 내기

truncate -s 0 test.txt

(크기를 지정하려면 "-s 0")

http://www.commandlinefu.com/commands/view/12/empty-a-file


3
가장 좋은 대답은 루트가 아닌 경우 (sudo 포함) 작동합니다 sudo echo > file. 이러한 경우 오류가 발생합니다.
Dmitry Verkhoturov

12
@ DmitryVerkhoturov : sudo bash -c '> filename'sudo와 함께 Bash 솔루션을 사용하는 방법입니다.
스튜어트 P. 벤틀리

1
brew install truncatehomebrew가 설치된 OS x에서.
xaxxon

에코보다 빠르게 작동
Miao1007

34

당신은 이것을 할 수 있습니다 :

echo -n "" > file.log

파일에 >(널) 입력을 쓰는 데 사용 echo -n합니다.

사용하는 >>것입니다 추가 파일에 널 (null) 입력을 (효과적으로 아무것도하지 않고 있지만 touch그것을 보내고).


이것은 거기에 공간을 남길 것입니다.
dmckee

나는 이것을 얻는다 : -bash : : command not found
Andrew

3
echo "">는 여전히 하나의 문자 (개행 문자)를 가진 파일을 제공합니다. echo를 사용하려면 "echo -n> file.log"를 사용하여 널을 에코하십시오.
Dave Forgac

궁극적으로 명령이 전혀 필요하지 않지만 true(또는 기본 제공 별칭 :) 과 같은 전용 null 출력 명령을 사용하는 것이 좋습니다 (허용 된 답변 참조).
스튜어트 P. 벤틀리

에 문제가있을 수 있습니다 sudo.
플랩 잭

27
: > file.log

> filenameBash 와 동일 하지만 더 많은 쉘 (신용) 에서 작동합니다 . true내장 (출력이없는) 의 출력을로 리디렉션합니다 filename.


나는이 대답을하기 위해 왔지만 아아 그것은 이미 여기에 있습니다 ... 공감하십시오.
Aaron Hall

5
그냥하세요 :> filename. 스마일처럼 보이지 않습니까? :>
minmaxavg 2018 년

10

ZSH

>! filename

ZSH는 io redirect 연산자를 사용하여 파일을 방해하는 파일로부터 사용자를 보호합니다 >. 사용 >!하면 기존 파일을 강제로자를 수 있습니다.

ZSH가 Bash의 리디렉션 동작을 사용하도록하려면 파일 클로버 링으로부터 보호되지 않았 으면 clobber셸에 대한 옵션 을 설정해야합니다 .

추가 정보 : http://zsh.sourceforge.net/Doc/Release/Redirection.html


8

명령 행의 vim 편집기에서 수행하려면 다음을 시도하십시오.

vim file.txt 

를 누릅니다 Esc.

:1,$d

를 누릅니다 Enter.

모든 줄이 삭제됩니다.


이것은 내 근무 유일한 일이 maillog도, sudo > /var/log/maillog(허가 거부)을 취소하지 않을
bobobobo

2
@bobobobo 그것은 sudo > /var/log/maillog수단으로 작동하지 않습니다-sudo를 실행하고 출력을 파일에 넣으십시오. 분명히 현재 사용자 권한으로 출력합니다. sudo su루트 쉘을 시작한 다음하는 것이 더 쉽다 > /var/log/maillog.
kan

4
$ rm file.log; touch file.log

또는

$ cat > file.log

뒤에 control-d.

또는 ... 또는 ... 또는 ...

아 다음은 단일 명령 버전입니다.

$ dd if=/dev/null of=file.log

2
chickenmoo의 제안은 당신이 보여주는 옵션 echo "" > file.log보다 낫습니다. cat이 상황에서 cat더 적합한 곳 이 있습니다. 둘 다 동일한 쉘 재 지정을 사용하여 무거운 물건을 들어 올립니다.
quack quixote

2
cat 명령을 실행할 필요가 없습니다. "> file.log"만하면됩니다.
camh

파일을 제거하면 생성 날짜가 재설정됩니다.
Matteo

파일을 제거하면 해당 파일을보고있는 프로그램이 해당 파일에 대한 포인터를 잃게됩니다 (즉, 파일 시스템에 새 주소가 있음). 일반적으로 yes rm는 동일한 이름의 빈 파일을 생성하는 작업을 수행합니다. 그러나 모든 사용 사례에 적합하지는 않습니다.
robert



1

몇 가지 대안 :

ex +%d -scwq file.log
cp /dev/null file.log
vi +%d -escwq file.log
install -m600 /dev/null file.log

1

파일 이름에 공백이 있으면 다음을 사용하십시오.

for file in /path/to/file/*; do > "$file"; done

(50 개의 평판이 없기 때문에 이전 답변에 대한 의견에 포함시킬 수 없었습니다. 때로는 한계가 반대로 생산적입니다.)


0

한 번에 한 줄?

무엇이든 할 수있는 멋진 텍스트 편집기 인 vi (m)을 사용해보십시오. 이 경우 라인으로 이동하고 d (삭제)를 누르고 d (라인)를 다시 누릅니다.


5
vim에서 전체 파일을 제거하려면 커서를 문서 상단에 놓고 d G를 입력하면 (d, shift-G) 전체 파일이 삭제됩니다 (d는 삭제, G는 파일). 그래도 귀하의 방법을 선호합니다 (파일을 휴지통에 버릴 것인지 여부를 생각할 시간이 더 있습니다).
Babu

@Babu gg는 맨 위로 이동하여 전체 시퀀스가 ​​가능 ggdG합니다.
Bob

0

내 권한으로 이것이 작동 한 유일한 것입니다.

touch temp.txt
sudo mv temp.txt original-file.txt

0

또한 파일이 여러 개인 경우 다음을 사용할 수 있습니다.

for file in /path/to/file/*; do > $file; done

이는 동일한 디렉토리에있는 로그 파일에 유용합니다.


0

> a.txt

Bash의> filename과 동일하지만 더 많은 쉘 (신용)에서 작동합니다. 출력이없는 실제 내장 출력을 파일 이름으로 리디렉션합니다.

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