How can I create an empty file from the command line?
The touch utility sets the modification and access times of files to the current time of day. If the file doesn't exist, it is created with default permissions.
Will also create an empty file. If the file does already exist, it will be truncated (emptied). To keep the file contents, use
>> for appending as in:
Even if the file exists, the contents will be untouched.
Edit: If you don't have any content to type, this one is faster:
user@host$ :> newfile user@host$ :>> new_or_existing_file
: is the command here. It is not part of the prompt.
In general, creating any regular1 file on Linux involves
creat(2) system calls (and specifically with
O_CREAT flags). That means if you call any command-line utility that does these system calls, you can create a new empty file.
Most commonly new filename is created with something like this:
: > /tmp/new_file
true > /tmp/new_file
> /tmp/new_file( bash shell only )
touch is a standalone utility. Its original purpose is to update the access and modification time of a file, however if the file does not exist - it will be created. Note also that a filename
- is treated specially, so if you do want to create a file that is named literally
-, you'll have to enclose that into single or double quotes.
> is a shell redirection operator for stdout stream. The
> operator specifically calls the
openat() system call with
O_WRONLY|O_CREAT|O_TRUNC flags. That means, if the filename does not exist - it will be created, and if it does - the data will be truncated (and therefore gone, so
> should be used with care). In most shells nowadays
: is a built-in , so doing
: > /tmp/new_file is going to be more efficient, although marginally compared to
But of course it does not stop there. As mentioned, anything that can perform
create() syscalls will create a file. Hence, we can do:
truncate --size 0 /tmp/new_filename.txt
cp /dev/null /tmp/null_file
tempfile( for creating temporary files that do not need to exist between reboots !)
Of course, all the above mentioned utilities do not exclusively create files. But they perform the necessary syscall and that allows us to adapt the commands.
Of course, at the level of programming or scripting we may want to create a file as well, especially for efficiency purposes (because calling external commands such as
touch from a Perl script or Python will require additional resources).
$ python -c 'import sys,os;f=sys.argv;os.utime(f,None) if os.path.exists(f) else open(f,"a").close' myfile.txt
We can make it shorter with this:
$ python -c 'import sys,os;f=sys.argv;'$'\n''with open(f,"a"): os.utime(f,None)' mysecondfile.txt
And in Perl:
$ perl -e 'open(my $fh,">","/tmp/perlfile")'
1 Other types of files such as hard/soft links,character or block special devices, directory,named pipes, or sockets require entirely different syscalls.