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.
In general, creating any regular1 file on Linux involves open(2) ,openat(2), and 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:
touch /tmp/new_file
: > /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.
By contrast, > 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 true or : is a built-in , so doing : > /tmp/new_file is going to be more efficient, although marginally compared to touch /tmp/new_file.
But of course it does not stop there. As mentioned, anything that can perform open(), openat() and, create() syscalls will create a file. Hence, we can do:
true|dd of=/tmp/newfile
truncate --size 0 /tmp/new_filename.txt
cp /dev/null /tmp/null_file
true|tee /tmp/some_other_file
mktemp or 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 one-liner:
$ python -c 'import sys,os;f=sys.argv[1];os.utime(f,None) if os.path.exists(f) else open(f,"a").close' myfile.txt
1 Other types of files such as hard/soft links,character or block special devices, directory,named pipes, or sockets require entirely different syscalls.
Use the
touch
command:Example:
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:
Note.
:
is the command here. It is not part of the prompt.the exact way there is also another way
The difference is file1.ext will be zero bytes and file2.ext would be one byte. You can check this by
Using
vim
editor you can also create an empty file.Then save
The command
creates an empty file, if your version of
echo
supports the -n switch.Or you could use
printf
In general, creating any regular1 file on Linux involves
open(2)
,openat(2)
, andcreat(2)
system calls (and specifically withO_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:
touch /tmp/new_file
: > /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.By contrast,
>
is a shell redirection operator for stdout stream. The>
operator specifically calls theopenat()
system call withO_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 nowadaystrue
or:
is a built-in , so doing: > /tmp/new_file
is going to be more efficient, although marginally compared totouch /tmp/new_file
.But of course it does not stop there. As mentioned, anything that can perform
open()
,openat()
and,create()
syscalls will create a file. Hence, we can do:true|dd of=/tmp/newfile
truncate --size 0 /tmp/new_filename.txt
cp /dev/null /tmp/null_file
true|tee /tmp/some_other_file
mktemp
ortempfile
( 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 one-liner:
We can make it shorter with this:
And in Perl:
1 Other types of files such as hard/soft links,character or block special devices, directory,named pipes, or sockets require entirely different syscalls.