Windows yinelemeli dokunma komutu


17

Windows 7'de tarih / saat damgasını güncellemek için bir dizindeki tüm dosyalara (alt dizinler dahil) tekrar tekrar dokunabilirim?

Windows 7'nin bunu başarmak için bir mekanizması var mı?



Bu bağlantıdaki "kabul edilen" yanıtı, bir dosya için bunu gerçekleştirmek için .NET programlama kitaplıklarını kullanmakla ilgilidir. Diğerleri, tek dosyaları güncellemek için bir bağlam menüsü eklemekle ilgiliydi. N dosyalarına özyineli olarak yapmak için yerleşik bir komut arıyordum. Aşağıdaki cevap, tüm dosyalar için bunu yapmak için çalıştı. Yerleşik değil, işe yarıyor. Teşekkürler.
jmq

Bu , Unix dokunma komutunun Windows sürümünün kopyası değil, çünkü bu soru özellikle özyineleme istiyor. Bununla birlikte, bu soruya verilen birkaç cevabın özyinelemeli formlara sahip olduğunu unutmayın.
JdeBP

Yanıtlar:


19

Birkaç olasılık vardır:

  • Unix bir bağlantı noktasını kullanın touchkomuta ve basitçe birleştirmek findve touchUnix şekilde. Birkaç seçenek var. Genellikle bahsedilenler GNUWin32 , cygwin ve unxutils'dir . Daha az bilinen, ancak bazı yönlerden daha iyi olan, SFUA yardımcı program araç setinde , Windows 7 Ultimate sürümü ve Windows Server 2008 R2 ile birlikte kutuda gelen UNIX Tabanlı Uygulamalar için Alt Sistem'de çalışan araçlar . (Windows XP, bir yapabilirsiniz indirmek ve yüklemek Hizmetleri UNIX sürüm 3.5 için ). Bu araç komut satırı TUI araçları çok sayıda gelen mvve duhiç Korn ve C kabukları yoluyla,perlve awk. Hem x86-64 hem de IA64 lezzetlerinin yanı sıra x86-32'de de gelir. Programlar, cygwin1.dllWin32 üzerinde katman katmanlama gibi (örneğin ) emülatör DLL'leri yerine Windows'un yerel uygun POSIX ortamında çalışır . Ve evet, araç seti touchve find300 kadar başka.
    Bu araç setlerinin tümü, elbette dokunulması gereken her dosya için ayrı bir işlem yürütmenin iyi bilinen dezavantajına sahiptir. Aşağıdaki alternatiflerle ilgili bir sorun değil.

  • Kullanıcıların touchyazdığı ve yayınladığı birçok yerel Win32 komutundan birini kullanın . Birçoğu, bir Unix'in findetrafına sarılmasına gerek kalmadan özyineleme gerçekleştirmek için seçenekleri destekler . (Sonuçta, touchtaşınan Unix komutlarının bir yükü olmadığı için bir komut arayan bir kullanıcı tabanını hedefliyorlar .) Bunlardan biri , görebileceğiniz gibi bir seçenek olan Stéphane Duguaytouch--recursive .

  • CMD'nin gizemli gizemleri ile akıllı olun. Diğer yanıtta belirtildiği gibi COPY /B myfile+,,, COPYkomutun az bilinen "artı" sözdizimini (daha fazla rastlantısal olarak burada bulunabilir ) kullanarak bir dosyanın son değişiklik tarih damgasını güncelleyecektir . Bu, elbette, FOR /Rburada başka bir cevapta belirtildiği gibi, işlemi tekrarlayan bir şekilde gerçekleştirmek için birleştirilebilir .

  • Yeni bir komut yorumlayıcısı kullanın ve CMD'den daha az akıllı ve daha anlaşılır olun. JP Software'in TCC / LE'si bunlardan biridir. Bir ekler /Sseçeneği onun COPYkomuta biri kullanabilir anlamına COPY /Sbir ihtiyacını ortadan kaldırmak için "artı" sözdizimi ile FORsarıcı. Ancak bu, TCC / LE'nin doğrudan bir seçeneği destekleyen yerleşik bir TOUCH komutuna sahip olduğunu göz önünde bulundurarak, hayatı hala gereksiz hale getiriyor /S.


2
+1, COPY /B file+,,gitmenin yolu, hiçbir ekstra gerektirmez ... :-)
Tamara Wijsman

3
Powershell yolu:(ls file).LastWriteTime = DateTime.now
Tamara Wijsman

5

Onlar hazır mevcut olduğundan, ben xxutils yararlanmak öneriyoruz . Bunu çok kolaylaştıracak findve touchkomutlarını içerirler .

Değiştirmek istediğiniz en üstteki dizine geçtikten sonra:

bulmak. -tip f -exec dokunma {} +

5

Yalnızca mevcut Windows işlevlerini kullanmak için (yüklenecek ekstra bir şey yok) aşağıdakilerden birini deneyin:

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

(belirtilen yoldan başlayarak tüm dosyalara tekrar tekrar "dokunur")

VEYA

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

(geçerli dizinde başlayan tüm dosyalara tekrar tekrar "dokunma")


3
-1 Olduğu gibi bu komutlar dosyaları alt klasörlerden köke kopyalar ve sonuç bir karışıklıktır.
TonyG

1
+1 @TonyG'in söylediklerini düzeltmek için küçük bir bükülme: forfiles / S / C "cmd / c Kopyala / B nul: + ,,"
Alex Dupuis

son değiştirilme tarihi değişmez
beppe9000

4

Bunun muhtemelen biraz geç olduğunu biliyorum ama yine de başka birinin aynı şeye ihtiyacı olması durumunda cevabımı bırakacağım.

John T'nin cevabı benim için Windows 7'de işe yaramadı. Bazı araştırmalardan sonra işi mükemmel yapan SKTimeStamp adlı bu yardımcı programı buldum .

Nasıl çalıştığı hakkında daha fazla ayrıntı içeren bir makale: http://www.trickyways.com/2009/08/how-to-change-timestamp-of-a-file-in-windows-file-created-modified-and erişildi .

Yapmanız gereken adımlar şunlardır:

  • Uygulamayı yükle
  • Zaman damgalarını değiştirmek için gereken dizine gidin
  • Gezginin tüm dosyaları göstermesi için arama kutusunda * arayın
  • Tüm dosyalar bulunduğunda, hepsini seçin, sağ tıklayın ve Özellikler'i seçin.
  • İletişim kutusunda TimeStamps sekmesini seçin
  • Gerektiği gibi tarihleri ve saatleri ayarlayın ve tıklayın Dokunma

İşte bu kadar! Tüm dosyalarınız güncellendi! Herhangi bir unix aracına veya komut satırına gerek yoktur.


1

Veya zaten bir tür "dokunma" aracına sahip olduğunuzda, zaten Windows'da yerleşik olan araçları kullanabilirsiniz:

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

VEYA

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

(Not: Bunu bir toplu iş dosyasından yapıyorsanız ve forkomutu kullanmak istiyorsanız , değişkenleriniz için yüzde çift işaret kullandığınızdan emin olun. (Örneğin, %%iyerine %i)


1

Benim için de Windows 7'de başarısız oldu. Farklı sözdizimi kullandım ve işe koyuldum:

forfiles /c "cmd /c touch @file"

Unutmayın, recurse seçeneğini kullanmadım.


1

Powershell kullanma:

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

Bu benim için işe yaramıyor:The property 'LastWriteTime' cannot be found on this object.
Ben N

Windows Server 2012'de benim için çalıştı: (ls. \ Backup_db_20150810.sql) .LastWriteTime = Get-Date
ThiagoAlves

0

John T'nin yukarıdaki cevabına atfen:

find'S exec komutunu a \;ve `` +' ' ile bitirmek arasındaki farkı anlamaya çalışıyordum (ikincisini bilmiyordum).

Bu yararlı oldu: ( buradan )

-exec command ;
Komutu çalıştır; 0 durumu döndürülürse true. Bulmak için aşağıdaki tüm bağımsız değişkenler, ';' ile karşılaşıldı. '{}' Dizesi, bazı find sürümlerinde olduğu gibi, yalnızca yalnız olduğu bağımsız değişkenlerde değil, komutun bağımsız değişkenlerinde gerçekleştiği her yerde işlenen geçerli dosya adıyla değiştirilir.

-exec command {} +
-Exec eyleminin bu değişkeni, seçilen dosyalarda belirtilen komutu çalıştırır, ancak komut satırı, seçilen her dosya adı sonuna eklenerek oluşturulur; komutun toplam çağrı sayısı, eşleşen dosya sayısından çok daha az olacaktır. Komut satırı, xargs'ın komut satırlarını oluşturduğu gibi oluşturulur. Komutta yalnızca bir {{} örneğine izin verilir. Komut başlangıç ​​dizininde yürütülür.

c:\myfolder2 dosya içeren bir klasör düşünün a.txtveb.txt

  1. find . -type f -exec touch {} +şu şekilde yorumlanır:
    touch a.txt b.txt
    Bu xargs'ın çalışma biçimine benzer

  2. oysa find . -type f -exec touch {} \;şu şekilde yorumlanır:
    touch a.txt
    touch b.txt

Böylece, # 1 çok daha hızlıdır (ancak aşağıdaki komutun execyalnızca bir {}yer tutucuya sahip olabileceği sınırlaması da vardır ).


İyi bilgi ile harika yorum, ama sorunun cevabı değil. Bu bir yorum olsaydı + 1'ledi.
TonyG

1
:) Bu
Ashutosh Jindal

0

Geçerli dizin ve tüm alt dizinler için PowerShell kullanma:

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

Veya hemen ardından bir klasör belirleyebilirsiniz dir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.