Windowsの再帰タッチコマンド


17

Windows 7で、日付/時刻スタンプを更新するために、ディレクトリ(サブディレクトリを含む)内のすべてのファイルを再帰的にタッチするにはどうすればよいですか?

Windows 7にはこれを実現するメカニズムがありますか?



そのリンクの「受け入れられた」答えは、.NETプログラミングライブラリを使用して1つのファイルに対してそれを達成することです。その他は、単一のファイルを更新するためのコンテキストメニューの追加に関するものでした。Nファイルに対して再帰的に実行する組み込みコマンドを探していました。以下の答えは、すべてのファイルに対してそれを行うのに役立ちました。これは組み込みではありませんが、機能します。ありがとう。
-jmq

この質問は再帰を特に求めているため、WindowsバージョンのUnix touchコマンドの複製でもありません。ただし、その質問に対するいくつかの回答には再帰的な形式があることに注意してください。
JdeBP

回答:


19

いくつかの可能性があります。

  • Unixののポートを使用してtouchコマンドと単純に組み合わせるfindtouchUnixの方法インチ いくつかの選択肢があります。よく言及されるのはGNUWin32cygwin、およびunxutilsですです。あまり知られていませんが、いくつかの点では優れていますが、SFUAユーティリティツールキットのツールは、Windows 7 UltimateエディションとWindows Server 2008 R2が同梱されているUNIXベースアプリケーション用サブシステムで実行されます。(Windows XPの場合、1が可能ダウンロードしてインストールUNIXバージョン3.5のためのサービスを。)このツールキットには、コマンドラインTUIツールの数が多いからmvdu、KornシェルとCシェルを通じて、へperlおよびawk。x86-64とIA64の両方のフレーバーとx86-32があります。これらのプログラムは、cygwin1.dllWin32上に物事を重ねるエミュレータDLL(など)ではなく、Windowsのネイティブの適切なPOSIX環境で実行されます。そして、はい、ツールキットにはとがtouchありfind、その他約300があります。
    これらのツールキットにはすべて、もちろん、ファイルごとに個別のプロセスを実行するという既知の欠点があります。これは、次の選択肢の問題ではありません。

  • touch人々が書いて公開した多くのネイティブWin32 コマンドの1つを使用します。 それらの多くは、Unix findがそれらをラップする必要なしに、再帰を実行するオプションをサポートします。(彼らは、すべての後に、探しているユーザーベースのターゲットtouch、それは移植のUnixコマンドの全体の負荷を持っていないので、コマンドを。)その一つであるステファン・Duguayのtouchあなたが持って見ることができるようにどの--recursiveオプションを選択します。

  • CMDの不可解な謎を巧みに利用してください。 他の回答で述べたように、コマンドCOPY /B myfile+,,のあまり知られていない「プラス」構文を使用して、ファイルの最終変更日付スタンプを更新しますCOPY(詳細については、ちなみにここにあります)。FOR /Rここで別の回答で示唆されているように、これをもちろん組み合わせて操作を再帰的に実行できます。

  • 代替コマンドインタープリターを使用し、CMDよりも賢くなく、わかりやすくしてください。 JP SoftwareのTCC / LEもその1つです。これは、追加/SのオプションCOPYコマンドを 1で使用できることを意味し、COPY /Sする必要なくすために「プラス」の構文でFORラッパーを。ただし、TCC / LEにはオプションを直接サポートするTOUCHコマンド組み込まれいることを考えると、それでも実際には不必要に自分自身の生活を難しくしてい/Sます。


2
+1、COPY /B file+,,追加方法は不要です... :
Tamara Wijsman

3
(ls file).LastWriteTime = DateTime.now
Powershellの

5

すぐに利用できるため、unxutilsを利用することをお勧めします。彼らが含まれますfindtouchこれには、これを非常に簡単にするコマンドとコマンドがます。

変更したい最上位ディレクトリに変更した後:

見つける。-type f -exec touch {} +

5

既存のWindows機能のみを使用する(追加するものは何もインストールしない)には、次のいずれかを試してください。

forfiles /P C:\Path\To\Root /S /C "cmd /c Copy /B @path+,,"  

(指定されたパスで始まるすべてのファイルを再帰的に「タッチ」)

または

forfiles /S /C "cmd /c Copy /B @path+,,"   

(現在のディレクトリで始まるすべてのファイルを再帰的に「タッチ」)


3
-1現状のままで、これらのコマンドはサブフォルダーからルートにファイルをコピーし、結果は混乱です。
トニーG

1
+1 @TonyGが言ったことを修正するためのちょっとした工夫:forfiles / S / C "cmd / c Copy / B nul:+ ,,"
Alex Dupuis

最終変更
-beppe9000

4

これはおそらく少し遅すぎるかもしれませんが、他の誰かが同じものを必要とする場合に備えて、答えを残しておきます。

John Tの答えはWindows 7では機能しませんでした。いくつかの調査の後、SKTimeStampと呼ばれるこのユーティリティを見つけました。、。

これがどのように機能するかについての詳細を含む記事は次のとおりです:http : //www.trickyways.com/2009/08/how-to-change-timestamp-of-a-file-in-windows-file-created-modified-and -アクセス/

実行する必要がある手順は次のとおりです。

  • アプリケーションをインストールする
  • タイムスタンプを変更する必要があるディレクトリに移動します
  • エクスプローラーにすべてのファイルが表示されるように、検索ボックスで*を検索します
  • すべてのファイルが見つかったら、それらをすべて選択し、右クリックして[プロパティ]を選択します。
  • ダイアログで[タイムスタンプ]タブを選択します
  • 必要に応じて日付と時刻を調整し、タッチをクリックします

出来上がり!すべてのファイルが更新されました!UNIXのユーティリティやコマンドラインは不要です。


1

または、Windowsに既に組み込まれているツールを使用することもできます。これには、何らかの種類の "タッチ"ツールが既に用意されています。

for /r %i in (C:\Path\To\Root\*) do @touch "%i"

または

forfiles /P C:\Path\To\Root /S /C "touch @file"

(注意:バッチファイルからこれを実行していて、forコマンドを使用する場合は、変数に二重パーセント記号を使用してください(例:の%%i代わりに%i


1

私もWindows 7で失敗しました。私は異なる構文を使用し、それを機能させました:

forfiles /c "cmd /c touch @file"

注、再帰オプションは使用していません。


1

PowerShellを使用して:

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

これは私にはうまくThe property 'LastWriteTime' cannot be found on this object.
ベンN

Windows Server 2012で機能しました:(ls。\ backup_db_20150810.sql).LastWriteTime = Get-Date
ThiagoAlves

0

上記のジョンTの回答を参照してください。

findのexecコマンドを終了することと、\;と `+ 'ていました(後者については知りませんでした)。

これは役に立ちました:(ここから)

-exec command ;
コマンドを実行します。0ステータスが返された場合はtrue。findに続くすべての引数は、 ';'で構成される引数までコマンドの引数と見なされます 遭遇します。文字列 '{}'は、コマンドの引数で発生するすべての場所で処理される現在のファイル名に置き換えられます。findの一部のバージョンのように、それが単独の引数だけでなく。

-exec command {} +
この-execアクションのバリアントは、選択されたファイルに対して指定されたコマンドを実行しますが、コマンドラインは、選択された各ファイル名を最後に追加することによって構築されます。コマンドの呼び出しの総数は、一致するファイルの数よりもはるかに少なくなります。コマンドラインは、xargsがコマンドラインを作成するのとほぼ同じ方法で作成されます。コマンド内では '{}'の1つのインスタンスのみが許可されます。コマンドは開始ディレクトリで実行されます。

c:\myfolder2つのファイルa.txtを含むフォルダーとb.txt

  1. find . -type f -exec touch {} +次のように解釈されます:
    touch a.txt b.txt
    これはxargsの動作に似ています

  2. 一方、find . -type f -exec touch {} \;として解釈されます:
    touch a.txt
    touch b.txt

したがって、#1ははるかに高速です(ただし、次のコマンドにexec{}プレースホルダーを1つしか持てないという制限もあります)。


良い情報を持つ素晴らしいコメントですが、質問への答えではありません。これがコメントだった場合、+ 1します。
-TonyG

1
:)この投稿を行った記憶がありません:)
Ashutosh Jindal

0

現在のディレクトリとすべてのサブディレクトリにPowerShellを使用する:

dir -R | foreach { $_.LastWriteTime = [System.DateTime]::Now }

または、の直後にフォルダを指定できますdir

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