파일 내용 비우기


220

파일에서 모든 항목을 삭제하는 세 가지 방법을 알고 있습니다.

그들은

  • >filename
  • touch filename
  • filename < /dev/null

이 세 가지 중에서 >filename가장 적은 수의 키 입력이 필요하므로 가장 많이 남용 합니다.

그러나 큰 로그 파일과 작은 파일과 관련하여 세 가지 중 더 효율적인 방법 (더 효율적인 방법이있는 경우)을 알고 싶습니다.

또한 세 코드는 어떻게 작동하고 내용을 삭제합니까?


24
무엇에 대해 truncate -s 0 filename?
Martin Thoma 2016 년

cat과 '>'의 차이점 과 매우 유사하여 자세한 정보를 찾을 수 있는 파일을 제로화 합니다.
Stéphane Chazelas

첫 번째는 bash 명령 행에서 호출 된 경우에만 작동하지만 .sh 파일에서 실행되면 작동하지 않습니다.
Marco Marsala

8
touch는 내용을 삭제하지 않지만 파일의 액세스 시간을 변경합니다. 그것은 않습니다 만드는 것도 존재하지 않는 경우는 빈 파일을.
hbogert

답변:


293

실제로 두 번째 형식 touch filename은 파일에서 아무것도 삭제하지 않습니다. 비어있는 파일이 존재하지 않는 경우에만 파일을 만들거나 기존 파일의 마지막 수정 날짜를 업데이트합니다.

그리고 세 번째 filename < /dev/null는 파일 이름을 /dev/null입력 으로 실행하려고 시도합니다 .

cp /dev/null filename 공장.

효율적인면에서 가장 효율적인 방법은 다음과 같습니다 truncate -s 0 filename. 여기 참조 : http://linux.die.net/man/1/truncate를 .

그렇지 않으면, cp /dev/null filename또는 > filename둘 다 괜찮습니다. 절단시 열림 설정을 사용하여 파일을 열고 닫습니다. cp또한 열어서 /dev/null조금 느리게 만듭니다.

반면에 truncate 명령을 실행하려면 시스템에서 실행 파일을 열고로드 한 다음 실행해야하므로 스크립트에서 실행할 truncate때보 > filename다 속도가 느려질 수 있습니다.


9
그렇다면 왜 이것이 truncate가장 효율적 이라고 말 합니까?
Stéphane Chazelas

7
자르기 조작은 파일을 열지 않아도되는 ftruncate () 또는 truncate () 시스템 호출을 사용합니다. 또한 cp 및 > filename메소드가 호출해야하는 close () 시스템 호출을 피합니다 .
ash

3
실제로, (최소한 GNU 버전) Open (오픈) + ftruncate + close (자체를로드하고 초기화하기위한 많은 시스템 호출과 함께)를 수행합니다. 어쨌든 파일이 존재하지 않으면 파일을 만들어야합니다 그리고 truncate(2)그렇게하지 않습니다.
Stéphane Chazelas

를 사용 touch filename하면 inode가 동일하게 유지됩니까 (파일이 이전에 제공된 경우)?
pMan

1
@pMan 예, 당신은 그것을 시도하고 확인할 수 있습니다ls -i
terdon

43

다른 옵션은 다음과 같습니다.

echo -n > filename

의 맨 페이지에서 echo:

-n Do not print the trailing newline character.


크기는 어떻게 설정합니까? 30000 개의 null 문자를 원한다면 어떻게해야합니까?
사용자

3

sh, csh, bash 및 기타 명령에서 사용할 수있는 내장 명령 ":"이 있으며 경로 재 지정 출력 연산자 >로 파일을 자르는 데 쉽게 사용할 수 있습니다 .

#!/usr/bin/env bash
:> filename

내가 좋아하는 것은 "echo"와 같은 외부 명령이 필요하지 않다는 것입니다.

파일을 삭제 / 재 작성하는 대신 파일을 자르면 얻을 수있는 큰 이점 중 하나는이 파일과 함께 작동하는 응용 프로그램 (예 : 누군가가 tail -f filename모니터링 소프트웨어를 만드는 등 )을 다시 열 필요가 없다는 것입니다. 그들은 단지 파일 기술자를 계속 사용할 수 있으며 모든 새로운 데이터를 얻습니다.


man bash:쉘 내장이 효과가없는 것으로 설명합니다 .
Haxiel

예, >파일로 파일 을 리디렉션 하여 파일이 없으면 파일을 만들고 존재하는 경우 0으로 자릅니다. 더 잘 말하면 :를 사용하여 :아무것도하지 않고 >파일로 아무것도 리디렉션하지 않고 잘라냅니다.
Mirko Steiner

1
왜 그렇게 하시겠습니까? > file파일을 자르기에 충분합니다. 리디렉션 연산자 만 있으면됩니다.
terdon

1
때로는 > filename작동하지 않습니다. 예를 들어, zsh에서. 그러나 : > filename여전히 작동합니다.
CS Pei

Bash와 sh는 좋아 > myfile하지만, 예를 들어 다음 과 같은 csh 오류가있는 것 같습니다 : 잘못된 null 명령.
Mirko Steiner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.