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ı?
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ı?
Yanıtlar:
Birkaç olasılık vardır:
Unix bir bağlantı noktasını kullanın touch
komuta ve basitçe birleştirmek find
ve touch
Unix ş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 mv
ve du
hiç Korn ve C kabukları yoluyla,perl
ve awk
. Hem x86-64 hem de IA64 lezzetlerinin yanı sıra x86-32'de de gelir. Programlar, cygwin1.dll
Win32 ü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 touch
ve find
300 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 touch
yazdığı ve yayınladığı birçok yerel Win32 komutundan birini kullanın . Birçoğu, bir Unix'in find
etrafına sarılmasına gerek kalmadan özyineleme gerçekleştirmek için seçenekleri destekler . (Sonuçta, touch
taşı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+,,
, COPY
komutun 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 /R
burada 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 /S
seçeneği onun COPY
komuta biri kullanabilir anlamına COPY /S
bir ihtiyacını ortadan kaldırmak için "artı" sözdizimi ile FOR
sarı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
.
COPY /B file+,,
gitmenin yolu, hiçbir ekstra gerektirmez ... :-)
(ls file).LastWriteTime = DateTime.now
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")
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:
İşte bu kadar! Tüm dosyalarınız güncellendi! Herhangi bir unix aracına veya komut satırına gerek yoktur.
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 for
komutu kullanmak istiyorsanız , değişkenleriniz için yüzde çift işaret kullandığınızdan emin olun. (Örneğin, %%i
yerine %i
)
Powershell kullanma:
C:\> powershell (ls your-file-name-here).LastWriteTime = Get-Date
The property 'LastWriteTime' cannot be found on this object.
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:\myfolder
2 dosya içeren bir klasör düşünün a.txt
veb.txt
find . -type f -exec touch {} +
şu şekilde yorumlanır: touch a.txt b.txt
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 exec
yalnızca bir {}
yer tutucuya sahip olabileceği sınırlaması da vardır ).