Lệnh cảm ứng đệ quy Windows


17

Trong Windows 7, làm cách nào tôi có thể chạm đệ quy tất cả các tệp trong một thư mục (bao gồm cả thư mục con) để cập nhật dấu ngày / giờ?

Windows 7 có cơ chế để thực hiện điều này không?



Câu trả lời "được chấp nhận" trong liên kết đó là về việc sử dụng các thư viện lập trình .NET để thực hiện điều đó cho một tệp. Những cái khác là về việc thêm một menu ngữ cảnh để cập nhật các tập tin duy nhất. Tôi đang tìm kiếm một lệnh tích hợp để thực hiện đệ quy N tệp. Câu trả lời dưới đây làm việc cho tất cả các tập tin. Nó không phải là một tích hợp, nhưng nó hoạt động. Cảm ơn.
jmq

Đây cũng không phải là bản sao phiên bản Windows của lệnh cảm ứng Unix , bởi vì câu hỏi này được hỏi cụ thể cho phép đệ quy. Tuy nhiên, lưu ý rằng một vài câu trả lời cho câu hỏi đó có dạng đệ quy.
JdeBP

Câu trả lời:


19

Có một số khả năng:

  • Sử dụng một cổng của touchlệnh Unix và chỉ cần kết hợp findtouchtheo cách Unix. Có một số lựa chọn. Thường được đề cập là GNUWin32 , cygwinunxutils . Ít được biết đến, nhưng theo một số cách tốt hơn, là các công cụ trong bộ công cụ tiện ích SFUA , chạy trong Hệ thống con cho các Ứng dụng dựa trên UNIX có ngay trong hộp với phiên bản Windows 7 Ultimate và Windows Server 2008 R2. (Đối với Windows XP, người ta có thể tải xuống và cài đặt Dịch vụ cho UNIX phiên bản 3.5 .) Bộ công cụ này có một số lượng lớn các công cụ TUI dòng lệnh, từ mvdu, thông qua trình bao Korn và C, đểperlawk. Nó có cả hai hương vị x86-64 và IA64 cũng như x86-32. Các chương trình chạy trong môi trường POSIX thích hợp riêng của Windows, thay vì với các trình giả lập DLL (chẳng hạn như cygwin1.dll) xếp lớp các thứ trên Win32. Và vâng, bộ công cụ có touchfind, cũng như khoảng 300 người khác.
    Tất cả các bộ công cụ này đều có nhược điểm nổi tiếng là chạy một quy trình riêng cho mọi tệp được chạm vào, tất nhiên. Đó không phải là một vấn đề với các lựa chọn thay thế sau đây.

  • Sử dụng một trong nhiều touchlệnh Win32 gốc mà mọi người đã viết và xuất bản. Nhiều người trong số họ hỗ trợ các tùy chọn để thực hiện đệ quy, mà không cần thiết phải có Unix findđể bao quanh chúng. (Họ, sau khi tất cả, nhắm mục tiêu một userbase đó là tìm kiếm một touchlệnh bởi vì nó không có một tải trọng toàn bộ các lệnh Unix chuyển.) Một trong những là Stéphane của Duguaytouch mà như bạn có thể thấy có một --recursivetùy chọn.

  • Hãy thông minh với những bí ẩn phức tạp của CMD. Như đã đề cập trong câu trả lời khác, COPY /B myfile+,,sẽ cập nhật dấu thời gian sửa đổi cuối cùng của tệp, sử dụng cú pháp "cộng" ít được biết đến của COPYlệnh ( tình cờ có thể tìm thấy nhiều hơn ở đây ). Điều này tất nhiên có thể được kết hợp với FOR /Rđể thực hiện các hoạt động đệ quy, như được gợi ý trong một câu trả lời khác ở đây.

  • Sử dụng trình thông dịch lệnh thay thế và kém thông minh và đơn giản hơn so với CMD. TCC / LE của JP Software là một trong số đó. Nó thêm một /Stùy chọn vào lệnh của nóCOPY , nghĩa là người ta có thể sử dụng COPY /Scú pháp "cộng" để loại bỏ sự cần thiết của FORtrình bao bọc. Nhưng điều đó thực sự vẫn khiến cuộc sống trở nên khó khăn đối với bản thân, vì TCC / LE có lệnh TOUCH tích hợp hỗ trợ trực tiếp một /Stùy chọn.


2
+1, đây COPY /B file+,,là con đường để đi, không yêu cầu thêm ... :-)
Tamara Wijsman

3
Cách Powershell:(ls file).LastWriteTime = DateTime.now
Tamara Wijsman

5

Vì chúng có sẵn, tôi khuyên bạn nên tận dụng lợi thế của unxutils . Họ bao gồm findtouchlệnh này sẽ làm cho điều này rất dễ dàng.

Sau khi thay đổi thư mục trên cùng, bạn muốn sửa đổi:

tìm thấy . -type f -exec touch {} +

5

Để chỉ sử dụng chức năng Windows hiện có (không có gì thêm để cài đặt), hãy thử một trong các cách sau:

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

(đệ quy "chạm" tất cả các tệp bắt đầu trong đường dẫn đã chỉ định)

HOẶC LÀ

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

(đệ quy "chạm" tất cả các tệp bắt đầu trong thư mục hiện tại)


3
-1 Vì các lệnh này sao chép các tệp từ các thư mục con vào thư mục gốc và kết quả là một mớ hỗn độn.
TonyG

1
+1 Một chút thay đổi để khắc phục những gì @TonyG đã nói: forfiles / S / C "cmd / c Sao chép / B nul: + ,,"
Alex Dupuis

không thay đổi lần sửa đổi cuối cùng
beppe9000

4

Tôi biết điều này có lẽ hơi muộn nhưng tuy nhiên, tôi sẽ để lại câu trả lời của mình trong trường hợp người khác cần điều tương tự.

Câu trả lời của John T không hoạt động với tôi trên Windows 7. Sau một số nghiên cứu, tôi thấy tiện ích này có tên SKTimeStamp , hoạt động hoàn hảo.

Đây là một bài viết với nhiều chi tiết hơn về cách thức hoạt động của nó: http://www.trickyways.com/2009/08/how-to-change-timestamp-of-a-file-in-windows-file-created-modified-and -được xử lý / .

Dưới đây là các bước bạn cần thực hiện:

  • Cài đặt ứng dụng
  • Chuyển đến thư mục mà bạn cần thay đổi dấu thời gian
  • Tìm kiếm * trong hộp tìm kiếm để trình thám hiểm hiển thị tất cả các tệp
  • Khi tìm thấy tất cả các tệp, chọn tất cả, nhấp chuột phải vào chúng và chọn Thuộc tính
  • Trong đoạn hội thoại, chọn tab TimeStamp
  • Điều chỉnh ngày và giờ của bạn khi cần và nhấp vào Touch

Voila! Tất cả các tập tin của bạn đã được cập nhật! Không cần cho bất kỳ tiện ích unix hoặc dòng lệnh.


1

Hoặc bạn có thể sử dụng các công cụ đã được tích hợp sẵn trong Windows, khi bạn đã có một công cụ "cảm ứng" nào đó:

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

HOẶC LÀ

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

(NB: Nếu bạn đang làm điều này từ một tệp bó và muốn sử dụng forlệnh, hãy đảm bảo sử dụng các dấu hai phần trăm cho các biến của bạn. (Ví dụ %%ithay vì %i)


1

Nó cũng thất bại trên Windows 7. Tôi đã sử dụng các cú pháp khác nhau và làm cho nó hoạt động:

forfiles /c "cmd /c touch @file"

Lưu ý, tôi đã không sử dụng tùy chọn recurse.


1

Sử dụng powershell:

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

Điều này không hiệu quả với tôi:The property 'LastWriteTime' cannot be found on this object.
Ben N

Nó hoạt động với tôi trong Windows Server 2012: (ls. \ Backup_db_20150810.sql) .LastWriteTime = Get-Date
ThiagoAlves

0

Liên quan đến câu trả lời của John T ở trên:

Tôi đã cố gắng để hiểu sự khác biệt giữa kết thúc một find lệnh exec của a \;và a `+ '(tôi không biết về cái sau).

Điều này rất hữu ích: (từ đây )

-exec command ;
Thực thi lệnh; đúng nếu 0 trạng thái được trả về. Tất cả các đối số sau đây cần tìm được lấy làm đối số cho lệnh cho đến khi một đối số bao gồm ';' gặp phải Chuỗi '{}' được thay thế bằng tên tệp hiện tại đang được xử lý ở mọi nơi nó xuất hiện trong các đối số cho lệnh, không chỉ trong các đối số chỉ có một mình, như trong một số phiên bản tìm kiếm.

-exec command {} +
Biến thể của hành động -exec này chạy lệnh được chỉ định trên các tệp đã chọn, nhưng dòng lệnh được xây dựng bằng cách nối thêm từng tên tệp đã chọn ở cuối; tổng số lệnh gọi của lệnh sẽ ít hơn nhiều so với số lượng tệp được khớp. Dòng lệnh được xây dựng theo cách tương tự như xargs xây dựng các dòng lệnh của nó. Chỉ một trường hợp '{}' được cho phép trong lệnh. Lệnh được thực thi trong thư mục bắt đầu.

Hãy xem xét một thư mục c:\myfolderchứa 2 tệp a.txtb.txt

  1. find . -type f -exec touch {} +được hiểu là:
    touch a.txt b.txt
    Điều này tương tự như cách xargs hoạt động

  2. trong khi đó find . -type f -exec touch {} \;được hiểu là:
    touch a.txt
    touch b.txt

Do đó, # 1 nhanh hơn nhiều (nhưng cũng bị giới hạn bởi lệnh sau execcó thể chỉ có một {}trình giữ chỗ).


Nhận xét tuyệt vời với thông tin tốt, nhưng không phải là một câu trả lời cho câu hỏi. Sẽ có + 1'd nếu đây là một nhận xét.
TonyG

1
:) Tôi không có ký ức về việc đăng bài này :)
Ashutosh Jindal

0

Sử dụng PowerShell cho thư mục hiện tại và tất cả các thư mục con:

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

Hoặc bạn có thể chỉ định một thư mục ngay sau đó dir.

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.