Linuxコマンド「touch」に相当するWindows


175

Windowsでファイルの日付変更フィールドを更新する場合、何を使用しますか?

  1. C ++ 、. NET、C#、またはWindowsネイティブのものを介してアクセス可能なコマンド(Vistaが望ましい)
  2. ツール/アプリケーションはできれば無料で、可能であればオープンソースも

編集:CheapScotsmanによって指摘されているように、アプリケーションのページはすでにここにあります

C ++、C#、WSH、または同様のものを使ってこれを行う方法を誰かが知っていれば、他のすべてがリンクされた質問でカバーされていると思います。


上記の4つの選択肢と、ここで言及されていない4つの選択肢は、同様の質問への回答で見つけることができます。「Windows Recursive Touch Command」
-JdeBP

stackoverflow.com/questions/210201/… 負荷について言及しています。以下を含むREM.>a
-barlop

回答:


356

Windowsを使用してファイルの日付スタンプを変更するには、コマンドプロンプトで次のコマンドを使用します。

copy /b filename.ext +,,

filename.extファイルの名前はどこですか)。+,,特別なフラグでありcopy、単純にそれを言って、ファイルの日付/時刻を更新します

*ファイルの時刻と日付を変更する

ファイルを変更せずに現在の日時をファイルに割り当てる場合は、次の構文を使用します。

copy /b Source+,,

コンマは、Destinationパラメーターの省略を示します。

LumiとJustinのコメントに基づいて編集:これをバッチファイルに入れます。touch.cmd

@COPY /B %1+,, %1

これは、ファイルが現在のディレクトリにない場合でも機能します(Windows 7でテスト済み)。


46
これは何をしていますか?どこに文書化されていますか?(Googleは「+、」のインデックスを作成できず、「コピー」で検索しても何も役に立たないため、MSサイトが正しい方向に私を導きません。)つまり、それはうまく機能します。当たり前ですが、私は興味があります。
ダッシュトムバン


14
type touch.bat@echo off次の行とcopy /b %1 +,,-にそれを置くC:\binか、何を独自のスクリプトを持っている、とあなたは同じようにそれを使用することができますtouch myfile.txt
ルミ

17
Win7では、ファイルを含むフォルダーにいない場合、これは機能しません。現在の作業ディレクトリにコピーを作成します。

6
あなたは、リモートフォルダ(UNCパス)でこれを行う必要がある場合-あなたにもコピーコマンドへの宛先を指定する必要があります- copy /b Source+,, Source-どこSourceファイルへのフルパスが含まれて
ジャスティン・

162

多くの一般的なUnixユーティリティのネイティブWin32ポートであるunxutilsを使用し、推奨しています。そこにtouchコマンドがあります。


6
ほとんどすべてのUNIXからWindowsへのポートのように、これは、非Unicodeプログラムのデフォルトとして設定されたエンコーディング以外のファイル名のUnicode文字では機能しません。そのようなすべてのツールをトリップするテストファイル名:"test тест τεστ.txt"
RomanSt 14

gnuwin32にはあります。しかし実際、Unicode文字に対してはgnuwin32も失敗します。
-barlop

1
2017年からの更新Windows 10では、bashをインストールするWindows用のLinuxサブシステムを使用できます。cygwin、MinGW、unxutils、またはその他の部分的なUNIXからWindowsへのポートは必要ありません。docs.microsoft.com/en-us/windows/wsl/install-win10
ダボス

@Davosは、(通常は特権のない)ユーザーコンテキスト以外のファイルでこれを試しましたか?技術的には、LXSSのユーザーランド側は特権のないユーザーとして実行されているためです。
0xC0000022L

@ 0xC0000022Lは、touchコマンドのコンテキストで何を意味するのかわかりません。それはnix環境の他の何かのように、あなたはそれをするか、sudoすることができます、あるいはあなたは特権を持っていないのでできません。
ダボス

96

必要なのは、ファイルの最終変更日を変更することだけである場合(私の場合):

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date

9
PowerShell FTW。本当の意味で、unixはクールですが、PSはクールです。
マット

1
あなたにも、複数のファイル/フォルダの最後の時間の書き込みを更新することができます

12
これは1つのファイルでのみ機能します。複数のファイルの場合:ls * | ForEach-Object {$ _。LastWriteTime = Get-Date}
エリアルグランティ

2
再帰的に実行したい場合、これは非常にうまく機能します:gci -recu -inc " " | %{$ _。LastWriteTime = Get-Date}
-BrainSlugs83

6
@ BrainSlugs83:コードにバックティック `を使用:gci -recu -inc "*.*" | % { $_.LastWriteTime = Get-Date }
alldayremix

58
type nul >>file & copy file +,,
  • file存在しない場合に作成します。
  • ファイルの内容をそのままにします。
  • ただ、使用するcmdビルトインを。
  • 最終アクセス時刻と作成時刻の両方が更新されました。

更新

ああ!これは、読み取り専用ファイルでは機能しませんが、touch機能します。私は提案します:

:touch
if not exist "%~1" type nul >>"%~1"& goto :eof
set _ATTRIBUTES=%~a1
if "%~a1"=="%_ATTRIBUTES:r=%" (copy "%~1"+,,) else attrib -r "%~1" & copy "%~1"+,, & attrib +r "%~1"

xcopyのようにcopyが+ r属性を無視できないのは残念です。または、xcopyが奇妙なfilename +,,構文をサポートしていないのは残念です。
アベル

残念ながら、これは動作しません(少なくともWindows 7では動作しません)。ファイルが実際に変更されていない場合(つまり、リダイレクトするデータがない場合)、コマンドインタープリターはリダイレクト先のタイムスタンプを更新しないようです。
Synetech

32

@ダッシュトムバン:

Technetによる神秘的な「+」とコンマの説明は次のとおりです。

/ b Source +をコピー、

コンマは、Destinationパラメーターの省略を示します。

copyコマンドは、複数のファイルを単一の宛先ファイルにマージすることをサポートしています。コマンドプロンプトで空白文字を使用して空白の宛先を指定することはできないため、2つのコンマを使用してそれを示すことができます。

そして、これはTechnetのコピーコマンドリファレンスです:http : //technet.microsoft.com/en-us/library/bb490886.aspx


16
これで構文が台無しになりました。真剣に、彼ら何を考えていましたか?また、同じドキュメントに「宛先:必須」と書かれていることに注意してください。
sth

1
これはVistaでも機能しないようです。
キルブレイカー2009

1
Windows 7で動作します
Imran

5
コンマなしでも機能しました:file.ext +をコピーします。したがって、ドキュメントは実際の動作とは異なり、動作は合理的な期待からのものです。
アブガン

2
これは、Windows Server 2008で働いていたが、あなたは、ファイルを含むフォルダ内にある場合にのみ
FrinkTheBrave


21

ここにpowershellを使用した再帰バージョンがあります...これにより、すべてのファイルとサブディレクトリ、およびこのディレクトリのサブディレクトリ内のファイルの最終変更時刻が変更されます

ps c:myDir> Get-ChildItem . * -recurse | ForEach-Object{$_.LastWriteTime = get-date}

2
それほど冗長まだ唯一の標準のPowershell短縮形を使用して:ls * -recurse | % { $_.LastWriteTime = Get-Date }
ジョナス

15

GnuWin32のプロジェクトは、UnixコマンドラインユーティリティのGNU版のWindowsのポートを備えています。

多くの個別のパッケージとして提供され、他の依存関係なしで必要なコマンドのみをインストールできます。touchあなたが必要となるのcoreutilsのパッケージを。


15

cygwin付属していtouchます。フレームワーク全体をインストールしたくないと言ったことは知っていますが、cygwinは非常に軽量であり、UNIXのようなコマンドライン全体をオンにしなくてもdosコマンドウィンドウから呼び出すことができます。

インストールするツールを制御することもできるため、touch.exeファイルをインストールするだけで、フレームワークの残りの部分をそのまま残すことができます。


2
ここまでのポイントで、インストールする必要があるのは、ツールを使用するディレクトリ内のtouch.exeおよびcygwin.dllファイルだけです。cygwinベースのツールの使用に関連する他の依存関係はありません。
背の高いジェフ

1
これを試すとき(win7x64)touch.exeに加えて4つのcygwin dllが必要です:cygiconv-2.dll cygintl-8.dll cygwin1.dll cyggcc_s-1.dll
マットウィルキー

15

これを試して、バッチスクリプトで空のファイルを作成しました。これを使用できます:

ECHO text>file1.txt

3
これはBY FARの最良の迅速な方法です。.gitignoreファイルを作成する必要がありましたが、Windows 7は「ファイル名を入力する必要がある」などと文句を言い続け echo pie>.gitignoreました。

4
@Alexこれは無関係ですが、そのWindowsエラーはファイルがピリオドで始まるためです。Windows Explorerでそれを回避するための奇妙なハックがあります:ファイルもピリオドで終了します。したがって.gitignore.、Enterキーを押すと、Windowsは末尾のピリオドを削除します。クレイジーですが、動作します。
ブラッドキューピット

1
私はこれが人気のある大物選手を捕まえるのに十分な賛成票を投じることができることを望みます。
ジョナサンミー

1
ただし、空のファイルは作成されません。file1.txtには「テキスト」が含まれています。
ジョシュアマイヤーズ

14

これは、Windowsエクスプローラーで右クリック「タッチ」追加するために作成した簡単なregfile です。次のように呼び出すだけなので、スクリプトを作成するのも簡単です。

cmd.exe /c copy %1+nul %1 /by

そしてcopy nul some_file、空のファイルを作成することを忘れないでください(これは私がtouch最も頻繁に使用するものです)。
ジョーイ

了解!Zipファイルにアクセスできません(brinkster22.comが参照サイトである必要がある)。ジョン、これを更新できますか?
Dan7119

Win7で動作します。WinXPでは機能しません。「コピー」を実行した後、ファイル時間は変わりません。
エゴールスクリプチュノフ16


11

CodeProjectからこれを試してください。

  • インストールする必要はありません。
  • 必要に応じて、ソースを変更することもできます。

2
このリンクは質問に回答するかもしれませんが、回答の重要な部分をここに含め、参照用のリンクを提供する方が良いでしょう。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。
ヤンスクリャレンコ

9

また、Cygwinをインストールして、Touchだけでなく他の多くの* NIXコマンドも提供できます。


2
cygwinなしではWindowsに住むことはできません。
jweede

また、minttyを使用しないcygwinはかなり不自由です。
アヘ


5

スタックオーバーフローに関する同様の質問から。

タイムスタンプを更新するには(のその他の機能を無視してtouch)、次のようにします。

copy /b filename.ext +,,

1
これは、説明のない2年前のGish Domainsの回答の繰り返しです。
fixer1234

4

codeproject「Touch for Windows」はどうですか:http : //www.codeproject.com/KB/applications/touch_win.aspx

編集; ここと同じ質問:https : //stackoverflow.com/questions/51435/windows-version-of-the-unix-touch-command/51439


ありがとう。私は検索でそれを見逃しましたが、その結果、タッチスクリーンフォン関連のものが大量に発生しました。おそらく、より良いタグラベルが必要です。
facepalmd

4

ウェブサイトから:

Funduc So​​ftware Touchは、無料の「タッチ」ユーティリティで、1つ以上のファイルの時刻/日付および/または属性スタンプを変更できます。さらに、FS Touchは、既存のファイル時間から指定された秒数を加算/減算できます。「複雑なファイルマスク」を使用して、変更するファイルやサブディレクトリを指定できます。プログラムは、対話式またはコマンドラインから実行できます。バージョン7.2の新機能は、ファイル変更タイムスタンプ+/-指定された秒数を変更するコマンドラインスイッチです。

FS Touchは、Windows XP、Vista、Windows 7、およびWindows 8で動作します。


4

このコンテンツは、regファイルに保存できます。これにより、「タッチファイル」機能を持つすべてのファイルの右クリックコンテキストメニューが追加されます(Windows 7でテスト済み)。次のすべての行をregファイルにコピーます。ファイルを実行し、質問を承認します。任意のファイル(または複数のファイル)を右クリックします-「タッチファイル」オプションが利用可能になりました。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell]

[HKEY_CLASSES_ROOT\*\shell\Touch File]

[HKEY_CLASSES_ROOT\*\shell\Touch File\command]
@="cmd /C copy /b \"%1\" +,,"

3

1つ以上のプロジェクトでgitを使用している場合git-bash、Windows ベースのmingwにはtouchコマンドがあります。@ greg-hewgillに、「nixユーティリティがWindows用に存在することを指摘してくれたことに感謝したい。


3

PowerShellで試してみてください:

ni fileName.txt

NINew-Itemコマンドレットのエイリアスです。


1
SuperUserへようこそ。投稿していただきありがとうございます!niコマンドに関する詳細情報を提供するWebサイトへのリンクを追加できますか。また、コマンドの機能をさらに説明できますか?
hBy2Py

1
このNew-Itemコマンドレットを使用して、既存のファイルのタイムスタンプを更新することはできません。
Twisty Impersonator

タイムスタンプは更新されませんが、新しいファイルが作成されます。これがtouchの機能です。私から+1。
MikeMurko

2

以下をtouch.batとして%windir%\ system32フォルダーに保存するか、保存されているフォルダーをPATH環境変数に追加します。

@echo off
if %1.==. goto end
if not exist %1 goto end
copy /b %1 +,, > nul
echo %1 touched!
:end

サンプル使用法:

touch *.cpp
touch somefile.c

参照:Microsoft KB 69581


優れた!外部のものはありません、ただコピーしてください。そしてもちろん、私たちのほとんどはバッチストリップとしてそれを必要とします:)
MSFT

2

vimがインストールされている場合、簡単な方法を見つけました(大きなファイルには向いていません。ファイル全体を開いてから閉じます...)

vim foobar.txt +wq!

「+」は、次のコマンドを実行するための引数を設定します。「wq!」「書き込み、終了、強制」です。これにより、ファイルが開かれ、保存が行われ、その後すぐに閉じられます。


無意味に複雑で、かさばり、持ち運びできない。-1
MD XF

2

別のファイルからファイルの日付をネイティブに複製/複製し、バッチファイルから使用できる「タッチ」機能が必要でした。

したがって、ビデオファイルをバッチファイルに「ドラッグアンドドロップ」すると、FFMPEGが実行され、入力ファイルの「作成日」および「変更日」が出力ファイルにコピーされます。

これは、Unicodeファイル名の処理がバッチファイルでひどく、PowerShellがインラインでファイル名シンボルを台無しにし、それらをダブルエスケープするのが悪夢であることがわかるまで、最初は簡単に思えました。

私の解決策は、「タッチ」部分を「CLONE-FILE-DATE.ps1」と呼ぶ別のPowerShellスクリプトにすることでした。

param
(
  [Parameter(Mandatory=$true)][string]$SourcePath,
  [Parameter(Mandatory=$true)][string]$TargetPath
)

(GI -LiteralPath $TargetPath).CreationTime  = (GI -LiteralPath $SourcePath).CreationTime
(GI -LiteralPath $TargetPath).LastWriteTime = (GI -LiteralPath $SourcePath).LastWriteTime

次に、「CONVERT.BAT」バッチファイル内の使用例を示します。

%~dp0\ffmpeg -i "%~1" ACTION "%~1-output.mp4"

CHCP 65001 > nul && PowerShell -ExecutionPolicy ByPass -File "%~dp0\CLONE-FILE-DATE.PS1" "%~1" "%~1-output.mp4"

PowerShellは読みやすいと思うので、バッチについて説明します。

%〜dp0は、バッチファイルの現在のディレクトリです。

%〜1は、引用符なしでバッチにドロップされたファイルのパスです。

CHCP 65001> nulは文字をUTF-8に設定し、出力を飲み込みます。

-ExecutionPolicy ByPassを使用すると、グローバルポリシーを変更することなくPowerShellを実行できます。これにより、ユーザーが誤ってスクリプトを実行するのを防ぐことができます。


1

試して

fsutilファイルcreatenew new.txt 0


2
The FSUTIL utility requires that you have administrative privileges.-またtouch、既存のファイルのようには動作しません。
キーストンプソン

1

上記の5つの選択肢に加えて、ここでは言及されていない3つの選択肢がSuperUserにあります。「Windows Recursive Touch Command」


2
このリンクは質問に回答するかもしれませんが、回答の重要な部分をここに含め、参照用のリンクを提供する方が良いでしょう。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。
ヤンスクリャレンコ


1

あなたがあればまあ、本当にしたいtouch利用可能なコマンドを、あなたと呼ばれるバッチファイルでこれを置くことができますtouch.batし、それをスティックC:\Windows

TYPE NUL >>%1

簡単です。


この方法では、次のプラットフォームの変更時刻は更新されません。WindowsServer 2012 R2、Windows Server 2016、Windows 10
Nate

0

Unixの人々は、touchコマンドでファイルのファイル日付を更新するという一般的な問題を修正しました。ただし、Windowsの場合、特別な場合にはより簡単な方法が可能な場合があります。

アプリケーションタイルの背景色を表示するには、Windows 8.1のアプリケーションショートカットのタイムスタンプを更新する必要があります。このSOの質問を参照してください。上記の賢いツールの1つを実装するよりも、ショートカットのコメントフィールドを編集する方が簡単だと思います。ほとんどの人はこれを空のままにしますが、もちろん、有用なコメントがすぐに思いつきます。また、コメントが存在する場合、最終期間を追加または削除しても害はありません。


0

これは古い質問であり、Windows 10システムのタッチを発見したばかりです。ここからGitをダウンロードしてインストールし(私が思うに)、タッチのように見え、さまざまな他のユーティリティがbinフォルダーにあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.