287

I am aware of three methods to delete all entries from a file.

They are

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

Of these three I abuse >filename the most as that requires the least number of keystrokes.

However, I would like to know which is the most efficient of the three (if there are any more efficient methods) with respect to large log files and small files.

Also, how does the three codes operate and delete the contents?


1Edit: as discussed in this answer, this actually does not clear the file!

4
  • 34
    What about truncate -s 0 filename? Jun 29, 2014 at 16:18
  • Very similar to Difference between cat and '>' to zero out a file where you'll find more information. Oct 26, 2015 at 15:27
  • The first will work only if called from bash command line, but won't work if executed in a .sh file Nov 24, 2015 at 11:04
  • 11
    touch does not delete contents, but does change access time on the file. It does create an empty file if none existed.
    – hbogert
    Sep 28, 2016 at 10:12

3 Answers 3

371

Actually, the second form touch filename doesn't delete anything from the file - it only creates an empty file if one did not exist, or updates the last-modified date of an existing file.

And the third filename < /dev/null tries to run filename with /dev/null as input.

cp /dev/null filename works.

As for efficient, the most efficient would be truncate -s 0 filename (see here).

Otherwise, cp /dev/null filename or > filename are both fine. They both open and then close the file, using the truncate-on-open setting. cp also opens /dev/null, so that makes it marginally slower.

On the other hand, truncate would likely be slower than > filename when run from a script since running the truncate command requires the system to open the executable, load it, and then run it.

16
  • 12
    So why do you say that truncate is the most efficient? Aug 30, 2013 at 6:24
  • 9
    The truncate operation uses the ftruncate() or truncate() system call which does not bother to open the file. It also avoids the close() system call that cp and > filename methods need to call.
    – ash
    Aug 30, 2013 at 6:26
  • 3
    Actually, it (at least the GNU one) does an open+ftruncate+close (in addition to the many system calls it does to load and initialise itself), as anyway, it would have to create the file if it didn't exist and truncate(2) doesn't do that. Aug 30, 2013 at 8:01
  • If we use touch filename, will the inode remain same (provided there was a file before)?
    – pMan
    Aug 30, 2013 at 8:30
  • 1
    @pMan yes, you can try it and check with ls -i
    – terdon
    Aug 30, 2013 at 13:02
60

Other option could be:

echo -n > filename

From the man page of echo:

-n Do not print the trailing newline character.

1
  • How can I set the size? Say if I want 30000 null characters?
    – User
    Nov 16, 2016 at 23:52
8

There is a builtin command ":", which is available in sh,csh,bash and others maybe, which can be easily used with the redirecting output operator > truncate a file:

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

What I like on this is, that it does not need any external commands like "echo" etc.

One big advantage of truncating files instead of deleate/recreate them is, that running applications which works with this file (e.g. someone makes an tail -f filename or a monitoring software, ...) don't have to reopen it. They just can continue using the filedescriptor and gets all the new data.

5
  • man bash describes the : shell builtin as having no effect.
    – Haxiel
    Dec 3, 2018 at 10:06
  • Yes, and you redirect this with > in to the file, which creates the file if it does not exists, and if it exists you truncate it to zero. Better said: you use the : to do nothing, and use > to redirect nothing to a file, and truncate it. Dec 3, 2018 at 10:10
  • 1
    Why would you do that? > file is enough to truncate a file. You don't need any command, just the redirection operator.
    – terdon
    Dec 3, 2018 at 11:12
  • 3
    sometimes, > filename won't work. for example, in zsh. but : > filename works still.
    – CS Pei
    Dec 5, 2018 at 16:19
  • Bash and sh seems to like > myfile but e.g. csh errors with: Invalid null command. Dec 12, 2018 at 15:33

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .