Windows tương đương với lệnh Linux 'chạm'?


175

Bạn sử dụng gì khi bạn muốn cập nhật trường sửa đổi ngày của một tệp trên Windows?

  1. các lệnh có thể truy cập thông qua C ++, .NET, C # hoặc một cái gì đó có nguồn gốc từ Windows (tốt nhất là Vista)
  2. các công cụ / ứng dụng tốt nhất là miễn phí và nếu có thể thì cũng là nguồn mở

Chỉnh sửa: đã có một trang cho các ứng dụng như CheapScotsman chỉ ra ở đây .

Nếu bất cứ ai biết làm thế nào tôi có thể làm điều này thông qua C ++, C #, WSH hoặc một cái gì đó tương tự, tốt và tốt, thì tôi sẽ nghĩ mọi thứ khác được đề cập trong câu hỏi được liên kết.


Bốn lựa chọn thay thế được đề cập ở trên, cộng với bốn lựa chọn khác không được đề cập ở đây, có thể được tìm thấy trong câu trả lời cho một câu hỏi tương tự: "Lệnh chạm đệ quy Windows"
JdeBP

stackoverflow.com/questions/210201/ đề cập đến một tải, bao gồmREM.>a
barlop

Câu trả lời:


356

Nếu bạn muốn chạm vào dấu ngày của tệp bằng windows, hãy sử dụng lệnh sau tại dấu nhắc lệnh:

copy /b filename.ext +,,

( filename.exttên tập tin của bạn ở đâu ). Đây +,,là một lá cờ đặc biệt để copybảo nó chỉ cần cập nhật ngày / giờ trên tệp :

* Thay đổi thời gian và ngày của một tập tin

Nếu bạn muốn chỉ định thời gian và ngày hiện tại cho một tệp mà không sửa đổi tệp, hãy sử dụng cú pháp sau:

copy /b Source+,,

Dấu phẩy chỉ ra thiếu sót của tham số Destination.

Chỉnh sửa dựa trên nhận xét của Lumi và Justin: đặt tệp này trong một tệp bó, vd. chạm.cmd

@COPY /B %1+,, %1

Điều này hoạt động ngay cả khi tệp không nằm trong thư mục hiện tại (được thử nghiệm trên Windows 7).


46
Cái này đang làm gì vậy Nó được ghi nhận ở đâu? (Google không lập chỉ mục "+ ,," và trang web MS không đưa tôi đi đúng hướng khi tìm kiếm trên 'bản sao' cho thấy không có gì hữu ích.) Ý tôi là, nó hoạt động rất tốt và tôi sẽ hiểu điều đó nhiều cho phép, nhưng tôi tò mò.
dash-tom-bang


14
type touch.bat@echo offvà dòng tiếp theo copy /b %1 +,,- đặt nó vào C:\binhoặc những gì bạn có cho các tập lệnh của riêng bạn, và sau đó bạn có thể sử dụng nó như thế nào touch myfile.txt.
Lumi

17
Trong Win7, điều này sẽ không hoạt động nếu bạn không có trong thư mục chứa tệp. Nó sẽ tạo một bản sao trong thư mục làm việc hiện tại.

6
Nếu bạn cần thực hiện việc này trong một thư mục từ xa (đường dẫn UNC) - bạn cũng phải chỉ định đích đến lệnh sao chép - copy /b Source+,, Source- trong đó Sourcebao gồm đường dẫn đầy đủ đến tệp
Justin

162

Tôi đã sử dụng và đề xuất unxutils là các cổng Win32 gốc của nhiều tiện ích Unix phổ biến. Có một touchlệnh trong đó.


6
Như hầu hết mọi cổng unix-to-windows, điều này không hoạt động với các ký tự unicode trong tên tệp bên ngoài bộ mã hóa làm mặc định cho các chương trình không unicode. Kiểm tra tên tệp sẽ tăng lên mọi công cụ như vậy:"test тест τεστ.txt"
RomanSt

gnuwin32 có nó. nhưng thực sự, gnuwin32 cũng thất bại đối với các ký tự unicode.
barlop

1
Cập nhật từ năm 2017 Trong Windows 10, chúng ta có thể sử dụng hệ thống con Linux cho windows, cài đặt bash. Không cần cygwin, MinGW, unxutils hoặc bất kỳ unix một phần nào khác cho các cổng windows. docs.microsoft.com/en-us/windows/wsl/install-win10
Davos

@Davos bạn đã thử điều đó trên bất kỳ tệp nào ngoài ngữ cảnh người dùng (thường không được ưu tiên) chưa? Bởi vì về mặt kỹ thuật, phía người dùng của LXSS đang hoạt động với tư cách là người dùng không có quyền.
0xC0000022L

@ 0xC0000022L không chắc ý của bạn trong ngữ cảnh của touchlệnh. Nó giống như bất cứ điều gì khác trong môi trường nix, bạn có thể làm điều đó hoặc bạn có thể sudo nó, hoặc bạn không thể vì bạn không có đặc quyền.
Davos

96

Nếu tất cả những gì bạn muốn là thay đổi ngày sửa đổi cuối cùng của tệp (đó là trường hợp của tôi):

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

9
PowerShell FTW. Ý tôi là, nghiêm túc, unix thì ngầu nhưng PS thì ngầu hơn.
matt

1
Bạn cũng có thể cập nhật lần ghi cuối cùng cho nhiều tệp / thư mục

12
Điều này sẽ chỉ làm việc trên một tập tin. Đối với nhiều tệp: ls * | ForEach-Object {$ _. LastWriteTime = Get-Date}
Eli Algranti

2
Nếu bạn muốn thực hiện đệ quy, điều này hoạt động khá tốt: gci -recu -inc " . " | % {$ _. LastWriteTime = Ngày nhận}
BrainSlugs83

6
@ BrainSlugs83: sử dụng backticks `cho mã:gci -recu -inc "*.*" | % { $_.LastWriteTime = Get-Date }
alldayremix

58
type nul >>file & copy file +,,
  • Tạo filenếu nó không tồn tại.
  • Lá nội dung tập tin một mình.
  • Chỉ cần sử dụng tích cmdhợp.
  • Cả hai lần truy cập cuối cùng và thời gian tạo được cập nhật.

CẬP NHẬT

Trời ạ! Điều này không hoạt động trên các tệp chỉ đọc, trong khi touchđó. Tôi đề nghị:

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

Thật đáng tiếc khi sao chép không thể bỏ qua thuộc tính + r theo cách xcopy thực hiện. Hoặc, thật đáng tiếc khi xcopy không hỗ trợ filename +,,cú pháp kỳ lạ .
Abel

Thật không may, điều này không hoạt động (ít nhất là không có trong Windows 7). Có vẻ như trình thông dịch lệnh không cập nhật dấu thời gian của đích chuyển hướng nếu tệp không thực sự được sửa đổi (nghĩa là không có dữ liệu để chuyển hướng).
Synetech

32

@ dash-tom-bang:

Dưới đây là lời giải thích của Technet về '+' bí ẩn và dấu phẩy:

sao chép / b Nguồn + ,,

Dấu phẩy chỉ ra thiếu sót của tham số Destination.

Lệnh sao chép hỗ trợ hợp nhất nhiều tệp vào một tệp đích. Vì đích trống không thể được chỉ định bằng ký tự khoảng trắng tại dấu nhắc lệnh, nên có thể sử dụng hai dấu phẩy để biểu thị điều đó.

Và đây là tài liệu tham khảo lệnh sao chép của Technet: http://technet.microsoft.com/en-us/l Library / bb490886.aspx


16
Bây giờ điều đó chỉ sai cú pháp. Nghiêm túc mà nói , họ đã nghĩ gì? Cũng lưu ý tài liệu tương tự có nội dung "Điểm đến: Bắt buộc." ... Tôi rất ngạc nhiên.
sth

1
Điều này dường như thậm chí không hoạt động trong Vista ... Tôi tự hỏi liệu họ có cảm nhận được không?
quillbreaker

1
Hoạt động trong Windows 7
Imran

5
Nó hoạt động với tôi ngay cả khi không có dấu phẩy: sao chép file.ext + Vì vậy, tài liệu này khác xa với hành vi thực tế như hành vi là từ bất kỳ kỳ vọng hợp lý nào.
Abgan

2
Nó hoạt động trong Windows Server 2008 nhưng chỉ khi bạn ở trong thư mục chứa tệp
FrinkTheBrave


21

đây là phiên bản đệ quy sử dụng powershell ... điều này sẽ thay đổi thời gian sửa đổi lần cuối cho tất cả các tệp và thư mục con và các tệp trong thư mục con của thư mục này

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

2
Ít dài dòng hơn nhưng chỉ sử dụng các tốc ký Powershell tiêu chuẩn:ls * -recurse | % { $_.LastWriteTime = Get-Date }
Jonas

15

Các GnuWin32 dự án có cổng Windows của phiên bản Gnu của các tiện ích dòng lệnh Unix.

Nó đi kèm như một số gói riêng biệt và bạn có thể cài đặt chỉ các lệnh bạn cần mà không cần phụ thuộc khác. Đối với touchbạn sẽ cần gói CoreUtils .


15

cygwinđi kèm với touch. Tôi biết bạn đã đề cập rằng bạn không muốn cài đặt toàn bộ khung, nhưng cygwin khá nhẹ và có thể được gọi từ cửa sổ lệnh dos mà không bật toàn bộ dòng lệnh giống như unix.

Bạn cũng có thể kiểm soát những công cụ nào để cài đặt, vì vậy bạn chỉ cần cài đặt touch.exetệp và để phần còn lại của khung.


2
Theo quan điểm của bạn ở đây, tất cả những gì bạn cần cài đặt là tệp touch.exe và cygwin.dll trong một thư mục để sử dụng công cụ. Không có sự phụ thuộc nào khác liên quan đến việc sử dụng các công cụ dựa trên cygwin.
Cao Jeff

1
khi tôi cố gắng này (win7x64) Tôi cần 4 Cygwin dll của ngoài touch.exe: cygiconv-2.dll cygintl-8.dll cygwin1.dll cyggcc_s-1.dll
mờ Wilkie

15

Tôi đã thử điều này để tạo một tập tin trống trong tập lệnh bó của tôi. Bạn có thể sử dụng điều này:

ECHO text>file1.txt

3
Đây là bởi đến nay các phương pháp nhanh nhất .. Tôi chỉ cần thiết để tạo ra một tập tin .gitignore, và Windows 7 giữ phàn nàn "phải nhập một tên tập tin" vv vv echo pie>.gitignorelàm việc một điều trị - cảm ơn!

4
@Alex Điều này không liên quan, nhưng lỗi windows đó là do tệp bắt đầu bằng dấu chấm. Có một cách hack kỳ lạ để khắc phục điều đó trong Windows Explorer: làm cho tệp kết thúc bằng một khoảng thời gian. Vì vậy, gõ .gitignore.và khi bạn nhấn enter, Windows sẽ loại bỏ dấu chấm. Điên, nhưng nó hoạt động.
Brad Cupit

1
Tôi ước rằng tôi có thể cung cấp đủ điều này để nó sẽ thu hút được những người chơi lớn nổi tiếng.
Jonathan Mee ngày

1
Điều này không tạo ra một tệp trống mặc dù, file1.txt có "văn bản" trong đó.
Joshua Meyers

14

Đây là một regfile đơn giản mà tôi đã viết để thêm nhấp chuột phải vào "chạm" trong Windows explorer . Nó cũng dễ dàng để kịch bản nó, vì nó chỉ gọi:

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

Và đừng quên copy nul some_filetạo một tập tin trống (đó là những gì tôi thấy touchthường được sử dụng nhất).
Joey

Hành động! Tệp zip không thể truy cập (một cái gì đó về brinkster22.com cần phải là trang web giới thiệu). Jon, bạn có thể cập nhật điều này?
Dan7119

Hoạt động trên Win7. Không hoạt động trên WinXP: thời gian tệp vẫn giữ nguyên sau khi thực hiện "sao chép".
Egor Skriptunoff


11

Hãy thử cái này từ CodeProject .

  • Không cần cài đặt.
  • Nếu bạn muốn, bạn thậm chí có thể sửa đổi nguồn.

2
Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
Yan Sklyarenko

9

Bạn cũng có thể cài đặt Cygwin , cung cấp cho bạn Touch cũng như rất nhiều lệnh * NIX khác.


2
không thể sống trên cửa sổ mà không có cygwin.
jweede

Và cygwin mà không có bạc hà là khá khập khiễng.
Ahe


5

Từ một câu hỏi tương tự trên Stack Overflow.

Để cập nhật dấu thời gian (bỏ qua các chức năng khác của touch), tôi sẽ sử dụng:

copy /b filename.ext +,,

1
Đây là sự lặp lại câu trả lời của Gish Domains từ 2 năm trước mà không cần giải thích.
fixer1234

4

Làm thế nào về codeproject "Touch for Windows": http://www.codeproject.com/KB/appluggest/touch_win.aspx

biên tập; Câu hỏi tương tự như ở đây: https://stackoverflow.com/questions/51435/windows-version-of-the-unix-touch-command/51439


Cảm ơn. Tôi đã bỏ lỡ điều đó trong tìm kiếm của mình dẫn đến vô số thứ liên quan đến điện thoại màn hình cảm ứng. Có lẽ tôi cần một nhãn thẻ tốt hơn tôi đoán.
facepalmd

4

từ trang web:

Funduc Software Touch là tiện ích 'chạm' miễn phí cho phép bạn thay đổi tem thời gian / ngày & / hoặc thuộc tính trên một hoặc nhiều tệp. Ngoài ra, FS Touch có thể thêm / bớt một số giây được chỉ định từ thời gian tệp hiện có. Bạn có thể chỉ định (các) tệp và / hoặc thư mục con nào sẽ thay đổi thông qua 'mặt nạ tệp phức tạp'. Chương trình có thể được chạy từ tương tác hoặc dòng lệnh. Mới đối với phiên bản 7.2 là một công tắc dòng lệnh để thay đổi dấu thời gian đã sửa đổi tệp +/- số giây đã chỉ định.

FS Touch chạy trên Windows XP, Vista, Windows 7 và Windows 8.


4

Nội dung này có thể được lưu vào một tập tin reg. Điều này sẽ thêm một menu ngữ cảnh nhấp chuột phải cho tất cả các tệp có khả năng "Touch File" (được thử nghiệm trên Windows 7). Sao chép tất cả các dòng sau vào tập tin reg. Chạy tệp và phê duyệt câu hỏi. Nhấp chuột phải vào bất kỳ tệp nào (hoặc nhiều tệp) - tùy chọn "Chạm vào tệp" hiện khả dụng.

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

Nếu bạn đang sử dụng git cho một hoặc nhiều dự án, mingw dựa trên git-bashWindows có touchlệnh. Tôi muốn cảm ơn @ greg-hewgill vì đã chỉ ra cho tôi rằng các tiện ích nix tồn tại cho các cửa sổ, bởi vì chính điều đó đã khiến tôi có ý tưởng thử chạm vào git-bash.


3

trong PowerShell thử:

ni fileName.txt

NIlà một bí danh của lệnh ghép ngắn New-Item .


1
Chào mừng bạn đến với SuperUser. Cảm ơn vì đăng! Bạn có thể thêm một liên kết đến một trang web cung cấp thêm thông tin về nilệnh và có thể mô tả thêm những gì lệnh này không?
hBy2Py

1
Các New-Itemlệnh không thể được sử dụng để cập nhật các tem thời gian của một tập tin hiện có.
Kẻ giả mạo Twisty

Mặc dù nó không cập nhật dấu thời gian, nhưng nó tạo ra một tệp mới, đó là những gì cảm ứng làm. +1 từ tôi.
MikeMurko

2

Lưu các mục sau dưới dạng touch.bat trong thư mục% Windir% \ system32 của bạn hoặc thêm thư mục được lưu vào biến môi trường PATH của bạn:

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

Sử dụng mẫu:

touch *.cpp
touch somefile.c

Tham khảo: Microsoft KB 69581


Xuất sắc! Không có công cụ bên ngoài, chỉ cần sao chép. Và tất nhiên hầu hết chúng ta đều cần nó như một bản rút gọn hàng loạt :)
Bogdan Gavril MSFT

2

Tôi đã tìm thấy một cách nhanh chóng để làm điều đó nếu bạn đã cài đặt vim (không tuyệt vời cho các tệp lớn, sẽ mở toàn bộ tệp sau đó đóng nó ...)

vim foobar.txt +wq!

Đối số "+" để chạy các lệnh sau. "wq!" là "viết, bỏ, ép". Điều này sẽ mở tập tin, thực hiện lưu, sau đó đóng nó ngay lập tức sau đó.


Vô cùng phức tạp, cồng kềnh và không di động. -1
MD XF

2

Tôi muốn tính năng 'chạm' của nhân bản / sao chép ngày của tệp từ một tệp khác, nguyên bản và có thể sử dụng được từ một tệp bó.

Vì vậy, 'kéo và thả' tệp video vào tệp bó, FFMPEG chạy, sau đó 'Ngày tạo' và 'Ngày sửa đổi' từ tệp đầu vào được sao chép vào tệp đầu ra.

Điều này ban đầu có vẻ đơn giản cho đến khi bạn thấy các tệp bó rất tệ trong việc xử lý tên tệp unicode, PowerShell trong dòng bị rối với các ký hiệu tên tệp và thoát hai lần là một cơn ác mộng.

Giải pháp của tôi là biến phần 'chạm' thành tập lệnh PowerShell riêng biệt mà tôi gọi là 'CLone-FILE-DATE.ps1' và nó chứa:

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

Sau đây là ví dụ sử dụng trong tệp bó 'CONVERT.BAT' của tôi:

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

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

Tôi nghĩ PowerShell có thể đọc được, vì vậy sẽ chỉ giải thích lô nói:

% ~ dp0 là thư mục hiện tại của tệp bó.

% ~ 1 là đường dẫn của tệp được thả vào lô mà không có dấu ngoặc kép.

CHCP 65001> nul đặt các ký tự thành UTF-8 và nuốt đầu ra.

-ExecutPolicy ByPass cho phép bạn chạy PowerShell mà không cần sửa đổi chính sách toàn cầu, điều này có ở đó để ngăn mọi người vô tình chạy tập lệnh.


1

Thử

tập tin fsutil createnew new.txt 0


2
The FSUTIL utility requires that you have administrative privileges.- và nó không hoạt động như touchđối với các tệp hiện có.
Keith Thompson

1

Năm lựa chọn thay thế được đề cập ở trên, cộng thêm ba lựa chọn khác không được đề cập ở đây, có thể được tìm thấy trên SuperUser: "Windows Recursive Touch Command"


2
Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
Yan Sklyarenko


1

Chà, nếu bạn thực sự muốn có touchsẵn lệnh, bạn có thể đặt nó trong một tệp touch.batbó được gọi và dán nó vào C:\Windows:

TYPE NUL >>%1

Đủ đơn giản.


Phương pháp này KHÔNG cập nhật Thời gian sửa đổi trên các nền tảng sau: Windows Server 2012 R2, Windows Server 2016, Windows 10
Nate

0

Người Unix đã khắc phục sự cố chung về cập nhật ngày tệp của bất kỳ tệp nào bằng lệnh cảm ứng . Tuy nhiên, đối với Windows, đôi khi một phương pháp đơn giản hơn có thể áp dụng cho các trường hợp đặc biệt.

Tôi cần cập nhật dấu thời gian của phím tắt ứng dụng trong Windows 8.1 để có thể thay đổi màu nền của Khối ứng dụng, xem câu hỏi SO này . Thay vì thực hiện một trong những công cụ thông minh ở trên, tôi thấy việc chỉnh sửa trường bình luận của phím tắt dễ dàng hơn. Hầu hết mọi người để trống, nhưng tất nhiên, một nhận xét hữu ích nhanh chóng được hình thành. Và nếu một bình luận tồn tại, thêm hoặc xóa một giai đoạn cuối cùng không bao giờ gây hại.


0

Tôi đánh giá cao đây là một câu hỏi cũ, tôi mới phát hiện ra cảm ứng trên hệ thống Windows 10 của mình. Tôi đã tải xuống và cài đặt Git từ đây (tôi nghĩ) và có vẻ như cảm ứng và nhiều tiện ích khác có trong thư mục bin.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.