Linux komutunun Windows eşdeğeri 'dokunma'?


175

Windows'ta bir dosyanın tarihini değiştiren alanını güncellemek istediğinizde ne kullanıyorsunuz?

  1. C ++, .NET, C # veya Windows'taki doğal bir şeyle erişilebilir komutlar (Vista, tercihen)
  2. araçlar / uygulamalar tercihen serbest ve eğer mümkünse açık kaynaklı

Düzenleme: Burada CheapScotsman tarafından belirtilen uygulamalar için zaten bir sayfa var .

Kimse bunu C ++, C #, WSH veya benzer, iyi ve iyi bir şeyle nasıl yapabileceğimi bilirse , başka her şeyin bağlantılı soruda ele alınacağını düşünürdüm.


Yukarıda belirtilen dört alternatif, burada da belirtilmeyen dört alternatif, benzer bir sorunun cevabında bulunabilir: "Windows Özyinelemeli Dokunma Komutanlığı"
JdeBP,

stackoverflow.com/questions/210201/... dahil olmak üzere bir yük, sözREM.>a
barlop

Yanıtlar:


356

Pencereleri kullanarak bir dosyanın tarih damgasına dokunmak istiyorsanız, komut isteminde aşağıdaki komutu kullanın:

copy /b filename.ext +,,

( filename.extdosyanızın adı nerede ). +,,İçin özel bir bayrağı copysadece bunu söylüyorum dosya üzerinde tarih / saat güncelleme :

* Bir dosyanın saatini ve tarihini değiştirme

Geçerli saati ve tarihi, dosyayı değiştirmeden bir dosyaya atamak istiyorsanız, aşağıdaki sözdizimini kullanın:

copy /b Source+,,

Virgüller, Hedef parametresinin atlandığını gösterir.

Lumi ve Justin'in yorumlarına göre düzenleme: bunu bir toplu iş dosyasına koyun, örneğin. touch.cmd

@COPY /B %1+,, %1

Bu, dosya geçerli dizinde olmasa bile çalışır (Windows 7'de test edilmiştir).


46
Bu ne yapıyor? Nerede belgelenmiştir? (Google, "+ ,," dizininde başarısız oluyor ve MS sitesi 'kopyada' arama yapmak işe yaramadığı için beni doğru yönde yönlendirmiyor.) Demek istediğim, harika çalışıyor ve ben bunu alıyorum Bana verilen çok şey var ama merak ediyorum.
çizgi-tom-bang,


14
type touch.batolduğu @echo offve bir sonraki satır copy /b %1 +,,- koydu C:\binya da ne kendi el yazısı için teşekkür var, sonra hoşuna kullanabilirsiniz touch myfile.txt.
Lumi

17
Win7'de bu dosyayı içeren klasörde değilseniz işe yaramaz. Geçerli çalışma dizininde bir kopya yaratacaktır.

6
Bunu uzak bir klasörde yapmanız gerekiyorsa (UNC yolu) - copy komutunun hedefini de belirtmelisiniz - copy /b Source+,, Source- Sourcedosyanın tam yolunu içerir
Justin

162

Çok sayıda ortak Unix yardımcı programının yerel Win32 bağlantı noktaları olan unxutils kullandım ve önerdim . Orada bir touchkomut var.


5
Neredeyse her unix-to-windows portu olduğu gibi, bu unicode olmayan programlar için varsayılan olarak ayarlanan kodlama dışındaki dosya adlarındaki unicode karakterlerle çalışmaz. Bu tür her bir aracı açacak olan test dosya ismi:"test тест τεστ.txt"
RomanSt

gnuwin32'de var. ama gerçekte, gnuwin32'ler unicode karakterler için de başarısız oluyor.
barlop

1
2017'den Güncelleme Windows 10'da bash'ı yükleyen pencereler için Linux alt sistemini kullanabiliriz. Windows portlarına cygwin, MinGW, unxutils veya diğer herhangi bir kısmi unix'e gerek yok. docs.microsoft.com/en-us/windows/wsl/install-win10
Davos

@Davos, bunu (genellikle imtiyazsız) kullanıcı içeriğinden başka bir dosyada denediniz mi? Çünkü teknik olarak LXSS'nin kullanıcı tarafı, imtiyazsız kullanıcı olarak çalışıyor.
0xC0000022L

@ 0xC0000022L touchkomut bağlamında ne demek istediğinizi bilmiyor . Nix ortamlarında başka bir şeye benziyor, ya yapabilirsiniz ya da sudo yapabilirsiniz ya da ayrıcalıklarınız olmadığı için yapamazsınız.
Davos

96

Tek istediğin dosyanın son değiştirilme tarihini değiştirmekse (ki bu benim davamdı):

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

9
PowerShell FTW. Cidden, unix havalı ama PS daha havalı.
mat

1
Son defa birden fazla dosya / klasör yazmayı da güncelleyebilirsiniz

12
Bu sadece bir dosya üzerinde çalışacaktır. Birden fazla dosya için: ls * | ForEach-Object {$ _. LastWriteTime = Başlangıç ​​Tarihi}
Eli Algranti

2
Özyinelemeyle yapmak istiyorsanız, bu oldukça iyi çalışıyor: gci -recu -inc " . " | % {$ _. LastWriteTime = Son Tarih}
BrainSlugs83

6
@ BrainSlugs83: Kod için backticks `kullanın:gci -recu -inc "*.*" | % { $_.LastWriteTime = Get-Date }
alldayremix

58
type nul >>file & copy file +,,
  • fileVar değilse yaratır .
  • Dosya içeriğini yalnız bırakır.
  • Sadece cmddahili kullanır .
  • Hem son erişim hem de oluşturma süreleri güncellendi.

GÜNCELLEME

Gah! Bu, salt okunur dosyalar üzerinde touchçalışmaz , oysa . Öneririm:

: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"

Kopyalamanın, xcopy işlevini yaptığı + r özniteliğini görmezden gelememesi üzücü. Veya, xcopy'nın garip filename +,,sözdizimini desteklememesi üzücü .
Abel

Ne yazık ki bu işe yaramıyor (en azından Windows 7'de değil). Dosya yorumcusu değiştirilmediyse, komut yorumlayıcısının bir yeniden yönlendirme hedefinin zaman damgasını güncellemediği görünüyor (yani, yeniden yönlendirilecek veri yok).
Synetech

32

@ Çizgi-tom-patlama:

İşte Technet'in gizemli '+' ve virgüllerin açıklaması:

copy / b Kaynak + ,,

Virgüller, Hedef parametresinin atlandığını gösterir.

Copy komutu, birden fazla dosyayı tek bir hedef dosyaya birleştirmeyi destekler. Boş bir hedef, komut isteminde boşluk karakteri kullanılarak belirtilemediğinden, bunu belirtmek için iki virgül kullanılabilir.

Ve bu, Technet'in kopya komutu referansıdır: http://technet.microsoft.com/en-us/library/bb490886.aspx


16
Şimdi bu sadece karışık sözdizimi. Cidden, ne düşünüyorlardı? Ayrıca aynı belgelere "Hedef: Zorunlu" yazdığını unutmayın. Şaşırdım.
sth

1
Bu Vista'da bile çalışmıyor gibi görünüyor ... Acaba duyularına gelip gelmediklerini?
Quillbreaker

1
Windows 7'de çalışır
Imran

5
Benim için virgül olmadan bile işe yaradı: copy.ext dosyasını kopyalayın. Bu nedenle belgeler, davranışların makul beklentilerden olduğu kadar gerçek davranışlardan uzak olduğu anlamına gelir.
Abgan

2
Windows Server 2008'de çalıştı ancak yalnızca dosyayı içeren klasöründeyseniz
FrinkTheBrave


21

Burada powershell kullanarak özyinelemeli bir sürüm ... bu, tüm dosya ve alt dizinlerin ve bu dizinin alt dizinlerindeki dosyaların son değiştirilme zamanını değiştirecek

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

2
Daha az ayrıntılı ancak henüz yalnızca standart Powershell shorthands kullanıyor:ls * -recurse | % { $_.LastWriteTime = Get-Date }
Jonas

15

GnuWin32 projesi Unix komut satırı yardımcı programları Gnu sürümleri, Windows portu vardır.

Bir dizi ayrı paket olarak gelir ve ihtiyaç duyduğunuz komutları başka hiçbir bağımlılık olmadan kurabilirsiniz. Çünkü CoreUtils paketine touchihtiyacınız olacak .


15

cygwinile geliyor touch. Bütün bir çerçeveyi kurmak istemediğinizi belirttiğinizi biliyorum, ancak cygwin oldukça hafiftir ve tüm unix benzeri komut satırı açılmadan dos komut penceresinden çağrılabilir.

Hangi araçların yükleneceğini de denetleyebilirsiniz, böylece touch.exedosyayı kolayca yükleyebilir ve çerçevenin geri kalanını bırakabilirsiniz.


2
Buradaki amacınıza göre, yüklemeniz gereken tek şey aracı kullanmak için bir dizindeki touch.exe ve cygwin.dll dosyasıdır. Cygwin tabanlı araçların kullanımına bağlı olarak başka hiçbir bağımlılık yoktur.
Uzun Jeff,

1
Bunu denediğimde (win7x64) touch.exe ek olarak 4 cygwin dll'sine ihtiyacım var: cygiconv-2.dll cygintl-8.dll cygwin1.dll cyggcc_s-1.dll
matt wilkie 27:10

15

Bunu toplu komut dosyasımda boş bir dosya oluşturmak için denedim. Bunu kullanabilirsiniz:

ECHO text>file1.txt

3
Bu .. Sadece bir .gitignore dosyası oluşturmak için gerekli FAR iyi hızlı BY yöntemi olup, Windows 7 vs vs "Bir dosya adı girmelisiniz" şikayetçi tutan echo pie>.gitignorebir tedavi çalıştı - teşekkürler!

4
@Alex İlişkili değildir, ancak bu windows hatası, dosyanın bir süre ile başlaması nedeniyledir. Windows Gezgini'nde bunu aşmak için garip bir kesmek var: dosyayı da bir süre sonlandırın. Yani yazın .gitignore.ve bastığınız zaman Windows izleyen süreyi kaldırır. Çılgın, ama işe yarıyor.
Brad Cupit

1
Keşke bu kadar popüler oyuncuların büyük oyuncuları yakalayabileceğine dair yeterince olumlu ifade verebilsem
Jonathan Mee

1
Bu boş bir dosya oluşturmaz, ancak file1.txt dosyasında "text" bulunur.
Joshua Meyers

14

İşte Windows explorer'da sağ tıklayıp "dokunuş" eklemek için yazdığım basit bir dosya . Sadece çağırdığından beri senaryo yazması kolay olurdu:

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

copy nul some_fileBoş bir dosya oluşturmayı da unutmayın (ki, touchen sık kullandığım şey budur ).
Joey

Ah! Zip dosyasına erişilemiyor (atıf yapan site olması gereken brinkster22.com hakkında bir şey). Jon, bunu güncelleyebilir misin?
Dan7119

Win7'de çalışır. WinXP'de çalışmaz: "copy" işleminden sonra dosya süresi aynı kalır.
Egor Skriptunoff


11

Bunu CodeProject'den deneyin .

  • Yüklemeye gerek yok.
  • İsterseniz, kaynağı bile değiştirebilirsiniz.

2
Bu bağlantı soruyu cevaplayabilse de, cevabın temel kısımlarını buraya eklemek ve referans için bağlantıyı sağlamak daha iyidir. Bağlantılı sayfa değişirse, yalnızca bağlantı yanıtları geçersiz olabilir.
Yan Sklyarenko

9

Ayrıca size Touch ve diğer * NIX komutlarının bir bolluğunu veren Cygwin'i yükleyebilirsiniz .


2
cygwin olmadan pencerelerde yaşayamam.
jweede

Mintty olmadan cygwin oldukça topal.
Ahe


5

Bir itibaren benzer bir soru Yığın taşması.

Zaman damgalarını güncellemek için (diğer işlevlerini yok sayarak touch), şöyle giderdim:

copy /b filename.ext +,,

1
Bu, Gish Domains'in cevabını 2 yıl önceki açıklamadan tekrar eder.
fixer1234


4

web sitesinden:

Funduc Software Touch , bir veya daha fazla dosyadaki zaman / tarih ve / veya nitelik damgalarını değiştirmenize izin veren ücretsiz bir 'dokunma' aracıdır. Ek olarak, FS Touch mevcut dosya zamanından belirli bir saniye sayısını ekleyebilir / çıkarabilir. 'Karmaşık dosya maskeleri' ile hangi dosya (ların) ve / veya alt dizinlerin değiştirileceğini belirleyebilirsiniz. Program etkileşimli veya komut satırından çalıştırılabilir. Sürüm 7.2'de yeni olan, dosya değiştirme zaman damgasını +/- belirtilen saniye sayısını değiştirmek için kullanılan bir komut satırı anahtarıdır.

FS Touch, Windows XP, Vista, Windows 7 ve Windows 8'de çalışır.


4

Bu içerik bir reg dosyasına kaydedilebilir. Bu, "Dokunmatik Dosya" özelliğine sahip tüm dosyalar için bir sağ tıklama bağlam menüsü ekler (Windows 7'de test edilmiştir). Aşağıdaki tüm satırları reg dosyasına kopyalayın . Dosyayı çalıştırın ve soruyu onaylayın. Herhangi bir dosyaya (veya birden fazla dosyaya) sağ tıklayın - "Dosyaya Dokun" seçeneği artık kullanılabilir.

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

Git'i bir veya daha fazla proje için kullanıyorsanız, git-bashWindows tabanlı mingw touchkomutuna sahiptir. Greg-hewgill'e bana 'nix araçlarının pencereler için mevcut olduğunu, çünkü git-bash'ta dokunmayı denemek fikrini ortaya koyduğu için bana teşekkür etmek istiyorum.


3

PowerShell'de şunu deneyin:

ni fileName.txt

NIYeni Öğe cmdlet'inin diğer adıdır .


1
SuperUser'a hoş geldiniz. Gönderdiğiniz için teşekkür ederiz! niKomut hakkında daha fazla bilgi sağlayan bir web sitesine bağlantı ekleyebilir ve belki komutun ne yaptığını açıklayabilir misiniz?
hBy2Py

1
New-ItemCmdlet varolan dosyanın zaman damgası güncelleştirmek için kullanılamaz.
Twisty Impersonator

Zaman damgasını güncellemese de, dokunmanın yaptığı yeni bir dosya oluşturur. Benden +1.
MikeMurko

2

Aşağıdakileri% windir% \ system32 klasörünüze touch.bat olarak kaydedin veya PATH ortam değişkeninize kaydettiği klasörü ekleyin:

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

Örnek kullanım:

touch *.cpp
touch somefile.c

Başvuru: Microsoft KB 69581


Mükemmel! Harici bir şey yok, sadece kopyalayın. Ve tabii ki çoğumuz :) toplu Stript olarak gerek
Bogdan Gavril msft

2

Eğer vim yüklüyse bunu yapmak için hızlı bir yol buldum (büyük dosyalar için harika değil, tüm dosyayı açıp kapatın ...)

vim foobar.txt +wq!

"+", Aşağıdaki komutları çalıştırmak için argümanı ayarlar. "WQ!" "yazma, bırakma, zorlama" dır. Bu, dosyayı açacak, bir tasarruf yapacak ve ardından hemen sonra kapanacaktır.


Anlamsızca karmaşık, hacimli ve taşınabilir. -1
MD XF

2

Dosya tarihlerini başka bir dosyadan yerel olarak klonlama / çoğaltma özelliğinin 'dokunma' özelliğini ve bir toplu iş dosyasından kullanılabilir olmasını istedim.

Böylece video dosyasını toplu iş dosyasına 'sürükle ve bırak', FFMPEG çalışır, sonra girdi dosyasından 'Oluşturma Tarihi' ve 'Tarih Değiştirme Tarihi' çıktı dosyasına kopyalanır.

Toplu iş dosyalarının unicode dosya adlarını kullanmada korkunç olduklarını, satır içi PowerShell'in dosya adı sembollerini bozduğunu ve bunlardan çift kaçan bir kabus olduğunu görünene kadar bu ilk bakışta basit göründü.

Benim çözümüm 'dokunma' kısmını 'CLONE-FILE-DATE.ps1' olarak adlandırdığım ayrı bir PowerShell betiği haline getirmekti ve içerdiği:

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

Öyleyse, 'CONVERT.BAT' toplu iş dosyasındaki örnek kullanım şöyle:

%~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'in okunabilir olduğunu düşünüyorum, bu yüzden sadece toplu konuşmayı açıklayacağım:

% ~ dp0 , toplu iş dosyasının geçerli dizinidir.

% ~ 1 , toplu işlem üzerine tırnak içine bırakılan dosyanın yoludur.

CHCP 65001> nul , karakterleri UTF-8 olarak ayarlar ve çıktıyı yutar.

-ExecutionPolicy ByPass , insanların yanlışlıkla komut dosyası çalıştırmalarını önlemek için var olan global politikayı değiştirmeye gerek kalmadan PowerShell'i çalıştırmanıza izin verir.


1

Deneyin

fsutil dosyası createnew new.txt 0


2
The FSUTIL utility requires that you have administrative privileges.- ve touchmevcut dosyalardaki gibi davranmaz .
Keith Thompson

1

Yukarıda belirtilen beş alternatif ve burada belirtilmeyen üç seçenek SuperUser'da bulunabilir: "Windows Özyinelemeli Dokunmatik Komut"


2
Bu bağlantı soruyu cevaplayabilse de, cevabın temel kısımlarını buraya eklemek ve referans için bağlantıyı sağlamak daha iyidir. Bağlantılı sayfa değişirse, yalnızca bağlantı yanıtları geçersiz olabilir.
Yan Sklyarenko


1

Eğer buysa, gerçekten sahip olmak istiyorum touchkomut mevcuttur, adlı bir toplu dosyasında bu koyabilirsiniz touch.batve bunu sopa C:\Windows:

TYPE NUL >>%1

Yeterince basit.


Bu yöntem Aşağıdaki Platformlarda Değişiklik Yapan Saati güncellemez: Windows Server 2012 R2, Windows Server 2016, Windows 10
Nate

0

Unix çalışanları, herhangi bir dosyanın dosya tarihini dokunma komutuyla güncelleme sorununu çözdü . Ancak, Windows için, bazen özel durumlar için daha basit bir yöntem mümkündür.

Uygulama Döşemesinin arka plan renginde değişiklikler yapmak için Windows 8.1'deki bir uygulama kısayolunun zaman damgasını güncellemem gerekiyor, bu SO sorusuna bakın . Yukarıdaki akıllı araçlardan birini uygulamak yerine, kısayolun yorum alanını düzenlemeyi daha kolay buluyorum. Çoğu insan bu boş bırakıyor, ama elbette, yararlı bir yorum çabucak anlaşılıyor. Bir yorum varsa, son bir dönemin eklenmesi veya çıkarılması hiçbir zaman zarar vermez.


0

Bunun eski bir soru olduğunu takdir ediyorum, Windows 10 sistemime dokunduğumu yeni keşfettim. Git'i buradan indirip yükledim (sanırım) ve dokunuşa benziyor ve diğer çeşitli yardımcı programlar bin klasöründe.

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.