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?
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ó một số khả năng:
Sử dụng một cổng của touch
lệnh Unix và chỉ cần kết hợp find
và touch
theo cách Unix. Có một số lựa chọn. Thường được đề cập là GNUWin32 , cygwin và unxutils . Í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ừ mv
và du
, thông qua trình bao Korn và C, đểperl
và awk
. 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ó touch
và find
, 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 touch
lệ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 touch
lệ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 --recursive
tù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 COPY
lệ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 /S
tùy chọn vào lệnh của nóCOPY
, nghĩa là người ta có thể sử dụng COPY /S
cú pháp "cộng" để loại bỏ sự cần thiết của FOR
trì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 /S
tùy chọn.
COPY /B file+,,
là con đường để đi, không yêu cầu thêm ... :-)
(ls file).LastWriteTime = DateTime.now
Để 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)
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:
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.
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 for
lệ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ụ %%i
thay vì %i
)
Sử dụng powershell:
C:\> powershell (ls your-file-name-here).LastWriteTime = Get-Date
The property 'LastWriteTime' cannot be found on this object.
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:\myfolder
chứa 2 tệp a.txt
vàb.txt
find . -type f -exec touch {} +
được hiểu là: touch a.txt b.txt
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 exec
có thể chỉ có một {}
trình giữ chỗ).