313

On a windows machine I get this error

'touch' is not recognized as an internal or external command, operable program or batch file.

I was following these instructions which seem to be linux specific, but on a standard windows commandline it does not work like this:

touch index.html app.js style.css

Is there a windows equivalent of the 'touch' command from the linux / mac os / unix world ? Do I need to create these files by hand (and modify them to change the timestamp) in order to implement this sort of command? I am working with node and that doesn't seem very ... node-ish...

mit
  • 11,083
  • 11
  • 50
  • 74
CuriousAboutNode
  • 3,157
  • 2
  • 11
  • 6
  • 7
    A [simple Google search](https://www.google.com/webhp?hl=en#hl=en&q=touch+unix+program+for+windows) shows you lots of windows implementations of `touch`. Other discussion here: http://superuser.com/questions/10426/windows-equivalent-of-the-linux-command-touch and the [Cygwin library](https://www.cygwin.com/) is a common toolset of Unix commands on Windows. – jfriend00 May 03 '15 at 07:30
  • 4
    Possible Duplicate of this question: http://stackoverflow.com/questions/26343974/create-file-with-command-line-in-node – Plastic Sturgeon Feb 29 '16 at 18:58
  • Possible duplicate of [Create file with command line in Node](https://stackoverflow.com/questions/26343974/create-file-with-command-line-in-node) – phuclv Sep 20 '17 at 13:07
  • 2
    Please jump to [Raghuveer's answer](https://stackoverflow.com/a/53149762/465053) directly if you've landed here while using PowerShell. – RBT Mar 20 '19 at 06:54
  • 1
    Related post - [Equivalent of Linux `touch` to create an empty file with PowerShell?](https://superuser.com/q/502374/374397) – RBT Mar 20 '19 at 06:55
  • If using the PowerShell prompt: ``` New-Item index.html -Type File ``` or, the built-in short-cut: ``` ni index.html ``` – user3785010 Jul 23 '20 at 15:06

27 Answers27

440

An easy way to replace the touch command on a windows command line like cmd would be:

type nul > your_file.txt

This will create 0 bytes in the your_file.txt file.

This would also be a good solution to use in windows batch files.

Another way of doing it is by using the echo command:

echo.> your_file.txt

echo. - will create a file with one empty line in it.


If you need to preserve the content of the file use >> instead of >

>   Creates a new file
>>  Preserves content of the file

Example

type nul >> your_file.txt

You can also use call command.

Calls one batch program from another without stopping the parent batch program. The call command accepts labels as the target of the call.

Example:

call >> your_file.txt

--- or even if you don't want make it hard you can Just install Windows Subsystem for Linux (WSL). Then, type.

wsl touch

or

wsl touch textfilenametoedit.txt

Quotes are not needed.

Vlad Bezden
  • 83,883
  • 25
  • 248
  • 179
  • 2
    on windows 7 the first option produces a scary dialog, and then you see `access denied` in the console. The second option works just fine! – Decoded Jun 20 '17 at 08:47
  • 19
    The answer is wrong, it only works when the file does not exist. If the file exists, using `>>` the first does nothing, the second adds a line at the end of the file. The correct answer is https://superuser.com/questions/10426/windows-equivalent-of-the-linux-command-touch/764721#764721 – stenci Jan 19 '18 at 22:34
  • 3
    @stenci - I just tried it on a non-existent file and it worked just fine. It created the file ok. Maybe you lack admin rights? – dcp Feb 07 '18 at 16:55
  • 2
    @stenci that superuser link is great. You should post it as an answer. – Denise Skidmore Mar 15 '18 at 19:44
  • @DeniseSkidmore Thanks, I added the answer. It's down deep and people will more likely read my comment to this answer than my answer, but now it's there. – stenci Mar 15 '18 at 21:31
  • Indeed, like @stensi said: `type nul >> existing_file.txt` does nothing. – Bastiaan Veelo Aug 27 '19 at 15:31
  • i always use the "call" internal command: `call >> somefile.txt` this will create a new file if the file did not exist before; and updates the file's modification time if the file did exists. the "echo" command is very special, as mentioned above: one cannot use it to create and empty file. the `type nul` command is also a good one. (but as much as five characters longer than a simple `call`) – ThatsMe Apr 06 '20 at 11:56
  • can this just be marked as the right answer. – Carlos Murray Jun 16 '21 at 11:35
  • It;'s 2022 and this is still the best answer – lm5050 Jul 07 '22 at 08:25
86

Windows does not natively include a touch command.

You can use any of the available public versions or you can use your own version. Save this code as touch.cmd and place it somewhere in your path

@echo off
    setlocal enableextensions disabledelayedexpansion

    (for %%a in (%*) do if exist "%%~a" (
        pushd "%%~dpa" && ( copy /b "%%~nxa"+,, & popd )
    ) else (
        type nul > "%%~fa"
    )) >nul 2>&1

It will iterate over it argument list, and for each element if it exists, update the file timestamp, else, create it.

MC ND
  • 69,615
  • 8
  • 84
  • 126
  • this one's the best, works exactly as expected... other solutions here do work but leave warning/error texts, IDK if that exclusive to me. – Shakil Jul 03 '20 at 15:43
51

You can use this command: ECHO >> filename.txt

it will create a file with the given extension in the current folder.

UPDATE:

for an empty file use: copy NUL filename.txt

Aaron Clark
  • 742
  • 9
  • 16
39

On windows Power Shell, you can use the following command:

New-Item <filename.extension>

or

New-Item <filename.extension> -type file

Note: New-Item can be replaced with its alias ni

Raghuveer
  • 707
  • 7
  • 18
33

The answer is wrong, it only works when the file does not exist. If the file exists, using the first does nothing, the second adds a line at the end of the file.

The correct answer is:

copy /b filename.ext +,,

I found it here: https://superuser.com/questions/10426/windows-equivalent-of-the-linux-command-touch/764721#764721

stenci
  • 8,290
  • 14
  • 64
  • 104
24

I'm surprised how many answers here are just wrong. Echoing nothing into a file will fill the file with something like ECHO is ON, and trying to echo $nul into a file will literally place $nul into the file. Additionally for PowerShell, echoing $null into a file won't actually make a 0kb file, but something encoded as UCS-2 LE BOM, which can get messy if you need to make sure your files don't have a byte-order mark.

After testing all the answers here and referencing some similar ones, I can guarantee these will work per console shell. Just change FileName.FileExtension to the full or relative-path of the file you want to touch; thanks to Keith Russell for the COPY NUL FILE.EXT update:

CMD w/Timestamp Updates

copy NUL FileName.FileExtension

This will create a new file named whatever you placed instead of FileName.FileExtension with a size of 0 bytes. If the file already exists it will basically copy itself in-place to update the timestamp. I'd say this is more of a workaround than 1:1 functionality with touch but I don't know of any built-in tools for CMD that can accomplish updating a file's timestamp without changing any of its other content.

CMD w/out Timestamp Updates

if not exist FileName.FileExtension copy NUL FileName.FileExtension

Powershell w/Timestamp Updates

if (!(Test-Path FileName.FileExtension -PathType Leaf)) {New-Item FileName.FileExtension -Type file} else {(ls FileName.FileExtension ).LastWriteTime = Get-Date}

Yes, it will work in-console as a one-liner; no requirement to place it in a PowerShell script file.

PowerShell w/out Timestamp Updates

if (!(Test-Path FileName.FileExtension -PathType Leaf)) {New-Item FileName.FileExtension -Type file}

kayleeFrye_onDeck
  • 6,648
  • 5
  • 69
  • 80
  • 1
    What about the situation where the file exists and you want to update its modification timestamp to the current time? I don't see how these examples achieve that. – RoG Feb 27 '19 at 13:09
  • 2
    Great observation, RoG! I've updated the answer to address this :) – kayleeFrye_onDeck Feb 27 '19 at 20:17
  • 2
    This is the best answer. However, I'd still improve it by replacing `fsutil file CreateNew FileName.FileExtension 0` by `copy NUL Filename.FileExtension`, since the latter is shorter and does the same thing. – Keith Russell Oct 09 '19 at 21:28
  • @KeithRussell IIRC there was a specific reason I didn't use `copy` over `fsutil` but it's been a while... I'm pretty sure that's how I even learned about `fsutil` haha! I'll try to figure out why... – kayleeFrye_onDeck Oct 10 '19 at 21:20
  • 1
    Even if they do behave the same, I guess it’s premature for me to say one is better, without speed-testing. – Keith Russell Oct 10 '19 at 21:29
  • Nope, that was for not using `copy /b File.Ext +,,` due to not working when it didn't exist. `copy NUL File.ext` does actually work when it doesn't exist so thanks for the heads up! Updating it now :) – kayleeFrye_onDeck Oct 10 '19 at 21:31
  • 1
    My Powershell told me it could find the NUL filepath because it doesn't exist. – Christopher Carroll Smith Jul 06 '23 at 00:32
20

Use the following command on the your command line:

fsutil file createnew filename  requiredSize

The parameters info as followed:

fsutil - File system utility ( the executable you are running )

file - triggers a file action

createnew - the action to perform (create a new file)

filename - would be literally the name of the file

requiredSize - would allocate a file size in bytes in the created file

Ofer Haber
  • 618
  • 4
  • 10
  • 2
    Some explanation is required for this to be considered a decent answer. It is not clear what these five words mean. – jfriend00 May 03 '15 at 07:57
  • people might not like this answer, but this is how you create a file in windows. echoing is also possible - but this is the equivalent of touch – Ofer Haber Jun 11 '15 at 13:14
  • 2
    worked for me ... the requiredSize thing is weird though ... the command just fills your new file with thousands of `NULL`s ... weird ... so just use 0 ... generates an error if you skip the requiredSize ... – dsdsdsdsd Mar 11 '16 at 15:45
  • 1
    this commnad needs admin privilages :( – ADJ Jan 15 '18 at 06:03
  • 1
    touch also updates the timestamp on existing files, not just creates new files. – Denise Skidmore Mar 15 '18 at 19:38
  • 1
    touch is a quick way of doing it, closest to it would be echo or type, I guess, although this is a very handy tool for scripting and vastly used in WS16, thumbs up! https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/fsutil – Alan Aug 21 '18 at 08:31
16

install npm on you machine

run the below command in you command prompt.

npm install touch-cli -g

now you will be able to use touch cmd.

maxspan
  • 13,326
  • 15
  • 75
  • 104
9

You can replicate the functionality of touch with the following command:

$>>filename

What this does is attempts to execute a program called $, but if $ does not exist (or is not an executable that produces output) then no output is produced by it. It is essentially a hack on the functionality, however you will get the following error message:

'$' is not recognized as an internal or external command, operable program or batch file.

If you don't want the error message then you can do one of two things:

type nul >> filename

Or:

$>>filename 2>nul

The type command tries to display the contents of nul, which does nothing but returns an EOF (end of file) when read.

2>nul sends error-output (output 2) to nul (which ignores all input when written to). Obviously the second command (with 2>nul) is made redundant by the type command since it is quicker to type. But at least you now have the option and the knowledge.

Keldon Alleyne
  • 2,103
  • 16
  • 23
  • This is great, but it sets `%ERRORLEVEL%` to non-zero always. You could fix that problem by appending a noop `|| cd.`, but this always sets the error to 0, which might not be what you want if the "touch" fails. – Keith Russell Oct 09 '19 at 21:34
6

as mentioned

echo >> index.html

it can be any file, with any extension then do

notepad index.html

this will open your file in the notepad editor

navarq
  • 1,075
  • 2
  • 15
  • 20
5

No command – neither typenor echo– is necessary to emulate Unix's/Mac OS X's 'touch' command in a Windows Powershell terminal. Simply use the following shorthand:

$null > filename

This will create an empty file named 'filename' at your current location. Use any filename extension that you might need, e.g. '.txt'.

Source: https://superuser.com/questions/502374/equivalent-of-linux-touch-to-create-an-empty-file-with-powershell (see comments)

Oliver Schafeld
  • 17,358
  • 2
  • 15
  • 13
5

For a very simple version of touch which would be mostly used to create a 0 byte file in the current directory, an alternative would be creating a touch.bat file and either adding it to the %Path% or copying it to the C:\Windows\System32 directory, like so:

touch.bat

@echo off
powershell New-Item %* -ItemType file

Creating a single file

C:\Users\YourName\Desktop>touch a.txt

    Directory: C:\Users\YourName\Desktop

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2020-10-14  10:28 PM              0 a.txt

Creating multiple files

C:\Users\YourName\Desktop>touch "b.txt,c.txt"

    Directory: C:\Users\YourName\Desktop

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2020-10-14  10:52 PM              0 b.txt
-a----        2020-10-14  10:52 PM              0 c.txt

Also

  • Works both with PowerShell and the Command Prompt.
  • Works with existing subdirectories.
  • Does not create a file if it already exists:
New-Item : The file 'C:\Users\YourName\Desktop\a.txt' already exists.
  • For multiple files, creates only the files that do not exist.
    • Accepts a comma-separated list of filenames without spaces or enclosed in quotes if spaces are necessary:
C:\Users\YourName\Desktop>touch d.txt,e.txt,f.txt
C:\Users\YourName\Desktop>touch "g.txt, 'name with spaces.txt'"
rbento
  • 9,919
  • 3
  • 61
  • 61
3

You can also use copy con [filename] in a Windows command window (cmd.exe):

C:\copy con yourfile.txt [enter]
C:\CTRL + Z [enter] //hold CTRL key & press "Z" then press Enter key.
^Z
    1 Files Copied.

This will create a file named yourfile.txt in the local directory.

delliottg
  • 3,950
  • 3
  • 38
  • 52
3

I use cmder (a command line emulator)

It allows you to run all Linux commands inside a Windows machine.

It can be downloaded from https://cmder.net/

I really like it

3

From the Terminal of Visual Code Studio on Windows 10, this is what worked for me to create a new file:

type > hello.js
echo > orange.js
ni > peach.js
Enora
  • 156
  • 8
3

As Raghuveer points out in his/her answer, ni is the PowerShell alias for New-Item, so you can create files from a PowerShell prompt using ni instead of touch.

If you prefer to type touch instead of ni, you can set a touch alias to the PowerShell New-Item cmdlet.

Creating a touch command in Windows PowerShell:

From a PowerShell prompt, define the new alias.

Set-Alias -Name touch -Value New-Item

Now the touch command works almost the same as you are expecting. The only difference is that you'll need to separate your list of files with commas.

touch index.html, app.js, style.css

Note that this only sets the alias for PowerShell. If PowerShell isn't your thing, you can set up WSL or use bash for Windows.

Unfortunately the alias will be forgotten as soon as you end your PowerShell session. To make the alias permanent, you have to add it to your PowerShell user profile.

From a PowerShell prompt:

notepad $profile

Add your alias definition to your profile and save.

Jon Crowell
  • 21,695
  • 14
  • 89
  • 110
3

Using PowerShell, type: ni index.html or ni style.css or ni app.js

ni <filename>.<extension>
2

If you have Cygwin installed in your PC, you can simply use the supplied executable for touch (also via windows command prompt):

C:\cygwin64\bin\touch.exe <file_path>
Uri Ziv
  • 77
  • 3
  • my usual solution for integrating linux commands... my killer-command for this is grep... ;-) – ZEE Jan 20 '22 at 14:17
2

Assuming the file exists and you just need to update the timestamp.

type test.c > test.c.bkp && type test.c.bkp > test.c && del test.c.bkp
2

Use rem. > file.txt (notice the dot attached to the command "rem")
this creates an empty file

Joshua
  • 109
  • 2
  • 6
1

Shortest possible vanilla solution is :

.>myfile.txt

enter image description here

You will get an error , but file is created :

enter image description here

Royi Namir
  • 144,742
  • 138
  • 468
  • 792
0

If you are using VS Code, there is a command line tool code to help you open a non-exist file in VS Code.

Wade
  • 11
  • 1
  • 1
0

There is something missing in all of the other answers. The Linux touch command has a -t option, which lets you set the last modified time to any arbitrary date and time, not just the current time.

This sets the modification date of filename.txt to 20 December 2012 at 30 minutes after midnight.

touch -t 201212210030 filename.txt

To get the equivalent in Windows, you need to be in PowerShell, it can't be done in Cmd.

  • Change the creation date/timestamp of a file named filename.txt:
(Get-Item "D:\Test\filename.txt").CreationTime=("21 December 2012 00:30:00")
  • Change the last write date/timestamp of a file named filename.txt:
(Get-Item "D:\Test\filename.txt").LastWriteTime=("21 December 2012 00:30:00")
  • Change the last accessed date/timestamp of a file named filename.txt:
(Get-Item "D:\Test\filename.txt").LastAccessTime=("21 December 2012 00:30:00")
Amedee Van Gasse
  • 7,280
  • 5
  • 55
  • 101
0

If you have WSL with the appropriate distro like Ubuntu you can have the touch command in the CMD and not just the bash terminal. It works for me on Windows 10 & 11 Windows Terminal

Sebastian
  • 402
  • 3
  • 12
-1

Easy, example with txt file

echo $null >> filename.txt
-1

Yes you can use Node for Touch I just use that and its working all fine in windows Cmd or gitbash

enter image description here

Matheus Cuba
  • 2,068
  • 1
  • 20
  • 31
Asad Iftikhar
  • 53
  • 1
  • 4
  • 10
  • I didn't downvote this but I'll explain why it probably was. This question was tagged with `[cmd]`, and that implies that the OP wants an answer that works out-of-the-box for CMD, meaning no command-line utilities that aren't packed with a default Windows install. That will exclude virtually all scripting languages, even built-in Windows scripting languages like CScript, WScript, and PowerShell. The point is not that it works in the CMD env, but that its possible for anyone with access to CMD, not including permissions issues. – kayleeFrye_onDeck Feb 27 '19 at 20:28
-2

Use type instead of touch

type YOUR_FILE_NAME

However, it is limited to just a single file

Tridib Roy Arjo
  • 26
  • 2
  • 10