412

I have a log file that has a bunch of stuff in it that I don't need anymore. I want to clear the contents.

I know how to print the contents to the screen:

cat file.log

I know how to edit the file, line-by-line:

nano file.log

But I don't want to delete each line one at a time. Is there a way to do it in one command without destroying the file to do it?

18 Answers 18

662

In bash, just

> filename

will do. This will leave you with an empty file filename.

PS: If you need sudo call, please consider to use truncate as answered here.

4
  • 92
    This is probably the raddest command in the history of computing
    – blarg
    Dec 2, 2013 at 16:34
  • 8
    On the contrary, @Arekkusandaa.Irujasukin; it works just fine in any version of Windows, so long as, as mentioned, you are using bash as your shell and not e. g. cmd.exe or PowerShell, neither of which are POSIXy enough to be expected to handle such things.
    – DopeGhoti
    Feb 5, 2015 at 20:39
  • LInters complain, maybe more elegant is to true > filename
    – Pablo A
    Mar 23, 2020 at 19:15
  • 1
    This is fancy and short, but it does have a couple of downsides. First it's not immediately obvious how to handle file permissions such as the need for sudo. Of course you can do it with sudo bash -c '> filename', but spawning a shell is (relatively) expensive. Second it can easily trip up interactive shells that will actually hang waiting for input. This is especially relevant if you want to copy bits of a script into a terminal and get the same results. For these reasons I suggest the truncate based answer is actually more robust.
    – Caleb
    Apr 19, 2021 at 10:49
201

You can use the user command : truncate

truncate -s 0 test.txt

("-s 0" to specify the size)

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

5
  • 4
    Best answer around, works when you're non-root (with sudo) — sudo echo > file just gives an error in such cases. Aug 19, 2015 at 7:35
  • 13
    @DmitryVerkhoturov: sudo bash -c '> filename' is how you use the Bash solutions with sudo. Sep 14, 2015 at 19:03
  • 1
    brew install truncate on os x with homebrew installed.
    – xaxxon
    Jul 4, 2016 at 7:47
  • Works faster than echo
    – Miao1007
    Nov 26, 2018 at 6:30
  • This also works in a bash script, while > filename does not
    – Black
    Feb 23 at 10:59
49

You could do this:

echo -n "" > file.log

Using > to write the (null) input from echo -n to the file.

Using >> would append the null input to the file (effectively doing nothing but touching it).

5
  • 1
    This will leave a space in there. Jan 1, 2010 at 1:58
  • I'm getting this: -bash: : command not found
    – Andrew
    Jan 1, 2010 at 3:52
  • 6
    echo "" > will still give you a file with one character (a newline.) If you want to use echo, use "echo -n > file.log" to echo null. May 4, 2012 at 19:47
  • It would be better to use a dedicated null-output command like true (or its builtin alias :), although ultimately you don't need a command at all (see the accepted answer). Jul 25, 2014 at 5:09
  • You might have some problems with sudo.
    – flapjack
    Jan 10, 2019 at 2:44
44
: > file.log

Same as > filename in Bash, but works in more shells (credit). Redirects the output from the true builtin (which has no output) to filename.

3
  • 1
    I came to make this answer, but alas it is already here... Take an upvote.
    – Aaron Hall
    Dec 29, 2014 at 3:38
  • 10
    Just do :> filename. Doesn't it look like a smiley? :>
    – minmaxavg
    Sep 14, 2015 at 2:37
  • On a macOS, > filename freezes. But : > filename works.
    – shinokada
    Jul 28, 2021 at 1:26
15

ZSH

>! filename

ZSH will protect users from clobbering files using the io redirect operator >. If you use >! you can force the truncation of an existing file.

If you want ZSH to use Bash's redirection behavior, were there is no protection from file clobbering, then you need to set the clobber option for your shell.

More Info: http://zsh.sourceforge.net/Doc/Release/Redirection.html

11

IF you want to do from inside a vim editor in command line, you can try this:

vim file.txt 

Press Esc.

:1,$d

Press Enter.

You will find all lines deleted.

2
  • This is the only thing that worked for my maillog, even sudo > /var/log/maillog wouldn't clear it (permission denied)
    – bobobobo
    Jan 16, 2014 at 0:00
  • 2
    @bobobobo It doesn't work as sudo > /var/log/maillog means - run sudo, and put its output into the file. Obviously it puts output with current user permissions. Easier thing do sudo su to start root shell and then do > /var/log/maillog.
    – kan
    Oct 1, 2014 at 10:13
9

Below command should also work :

cat /dev/null > file.log
2
  • this is what ive been using for many years with no error
    – MaXi32
    Oct 13, 2020 at 5:58
  • This one should be the best compatible answer because truncate isn't built-in in BSD like MacOS and bash isn't defult shell for some OS. Mar 10 at 4:40
6
$ rm file.log; touch file.log

or

$ cat > file.log

followed by control-d.

or...or...or...

Ah. Here is a single command version:

$ dd if=/dev/null of=file.log
5
  • 2
    Thechickenmoo's suggestion of echo "" > file.log is better than the cat option you show, in this situation, tho there are others where cat is more appropriate. both use the same shell redirection to do the heavy lifting. Jan 1, 2010 at 4:57
  • 2
    You dont need to run the cat command. Just "> file.log" will do it.
    – camh
    Jan 1, 2010 at 6:22
  • 1
    Removing the file will reset the creation date.
    – Matteo
    Jul 16, 2013 at 12:40
  • Removing the file will cause programs watching that file to lose their pointer to it (i.e., it will have a new address in the filesystem). Generally speaking, yes rm will accomplish the task of producing an empty file with the same name. But it's not going to be right for every use case.
    – robert
    Dec 8, 2017 at 23:21
  • +1 for Robert. The rm way is useless in case you have a process writing into the file, while you want this truncation look unnoticed for this process.
    – jmary
    Jan 11, 2021 at 10:48
3

If you need to sudo to superuser privilege to access the file then the accepted answer will not work. Using this does work:

truncate -s0 file

or explicitly with sudo:

sudo truncate -s0 file

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

3

It can be done using sed

sed -i d filename

2
  • +1. and you can do also with awk but this will be too slow for large files.
    – Cuauhtli
    Jun 14, 2020 at 20:41
  • @Cuauhtli, why would it be slow?
    – CervEd
    Jun 17, 2021 at 18:06
1

Few alternatives:

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

If you have spaces in filenames, use:

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

(I could not to include it in comments to previous answer because I don't have 50 reputation. Sometimes limitations are contra productive.)

1

There are multiple ways to clear the file as listed below:

echo "" > filename
cat /dev/null > filename

Below examples are mostly used in shell scripting

just# > filename
: > filename
0

One line at a time?

Try vi(m), the lovely text editor that can do anything. In this case, navigate to a line, press d (for delete), and d again (for line).

2
  • 5
    If you want to get rid of the whole file in vim, with the cursor at the top of the document, typing d G (that's d, then shift-G) will delete the entire file (d for delete, G for end of the file). I prefer your method, though (it gives me more time to think about whether or not I REALLY want to trash the file).
    – Babu
    Jan 1, 2010 at 4:19
  • @Babu gg moves to the top so the entire sequence could be ggdG.
    – Bob
    Mar 4, 2014 at 0:22
0

With my permissions this is the only thing that worked:

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

Also, if you have multiple files you can use the following:

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

This is helpful for log files in the same directory.

0

In windows environment:

type nul >filename
-1

here is some test i have done: cat test cp test test.bkp cat /dev/null > test

This will empty the original test and but you can still access the test.bkp if you need the old contents of the file.

1
  • Welcome to Super User! Before answering an old question having an accepted answer (look for green ✓) as well as other answers ensure your answer adds something new or is otherwise helpful in relation to them. Here is a guide on How to Answer. There is also tour for the site tour, and help center for the help center. Mar 17, 2021 at 16:59

Not the answer you're looking for? Browse other questions tagged or ask your own question.