ใน Windows 7 ฉันจะสัมผัสไฟล์ทั้งหมดซ้ำในไดเรกทอรี (รวมถึงไดเรกทอรีย่อย) ซ้ำเพื่ออัปเดตวันที่ / เวลาได้อย่างไร
Windows 7 มีกลไกในการทำสิ่งนี้หรือไม่?
ใน Windows 7 ฉันจะสัมผัสไฟล์ทั้งหมดซ้ำในไดเรกทอรี (รวมถึงไดเรกทอรีย่อย) ซ้ำเพื่ออัปเดตวันที่ / เวลาได้อย่างไร
Windows 7 มีกลไกในการทำสิ่งนี้หรือไม่?
คำตอบ:
มีความเป็นไปได้หลายอย่าง:
ใช้พอร์ตของtouch
คำสั่งUnix และรวมเข้าด้วยกันfind
และtouch
ใช้วิธี Unix มีหลายทางเลือก ผู้ทรงกล่าวถึงเป็นGnuWin32 , CygwinและUnxUtils เป็นที่รู้จักกันน้อย แต่ในบางวิธีดีกว่าคือเครื่องมือในชุดเครื่องมืออรรถประโยชน์ SFUAซึ่งทำงานในระบบย่อยสำหรับแอพพลิเคชั่นที่ใช้ระบบปฏิบัติการ UNIXซึ่งมาในกล่องพร้อมกับ Windows 7 Ultimate edition และ Windows Server 2008 R2 (สำหรับ Windows XP สามารถดาวน์โหลดและติดตั้งบริการสำหรับ UNIX เวอร์ชัน 3.5ได้) ชุดเครื่องมือนี้มีเครื่องมือ TUI บรรทัดคำสั่งจำนวนมากจากmv
และdu
ถึง Korn และ C เชลล์perl
awk
และ มันมาในทั้งรสชาติ x86-64 และ IA64 เช่นเดียวกับ x86-32 โปรแกรมทำงานในสภาพแวดล้อม POSIX ที่เหมาะสมของ Windows แทนที่จะใช้ emulator DLLs (เช่นcygwin1.dll
) การวางซ้อนสิ่งต่าง ๆ บน Win32 และใช่ชุดเครื่องมือมีtouch
และfind
เช่นเดียวกับคนอื่น ๆ อีก 300 คน
ชุดเครื่องมือเหล่านี้ทั้งหมดมีข้อเสียที่รู้จักกันดีในการรันกระบวนการแยกต่างหากสำหรับทุกไฟล์ที่ต้องถูกสัมผัสแน่นอน นั่นไม่ใช่ปัญหากับทางเลือกต่อไปนี้
ใช้touch
คำสั่งWin32 ดั้งเดิมอย่างใดอย่างหนึ่งที่ผู้คนได้เขียนและเผยแพร่ หลายคนสนับสนุนตัวเลือกในการเรียกซ้ำโดยไม่จำเป็นต้องใช้ Unix find
เพื่อล้อมรอบพวกเขา (พวกเขาทั้งหมดกำหนดเป้าหมายไปยังฐานผู้ใช้ที่กำลังมองหาtouch
คำสั่งเพราะมันไม่ได้โหลดคำสั่ง Unix ที่พอร์ตทั้งหมด) หนึ่งในนั้นคือStéphane Duguaytouch
ซึ่งคุณสามารถเห็น--recursive
ตัวเลือกได้
ทำความเข้าใจกับความลึกลับที่ลึกลับของ CMD ดังที่กล่าวไว้ในคำตอบอื่น ๆCOPY /B myfile+,,
จะอัปเดตล่าสุดของการแก้ไขไฟล์โดยใช้ไวยากรณ์ "plus" ที่รู้จักกันน้อยของCOPY
คำสั่ง (ซึ่งสามารถพบได้ที่นี่โดยบังเอิญ) หลักสูตรนี้สามารถใช้ร่วมกับFOR /R
การดำเนินการแบบเรียกซ้ำได้ตามคำแนะนำในคำตอบอื่นที่นี่
ใช้ล่ามคำสั่งการแทนที่และฉลาดน้อยกว่าและตรงไปตรงมามากกว่า CMD TCC / LE ของ JP Softwareเป็นเช่นนั้น มันจะเพิ่ม/S
ตัวเลือกในการของCOPY
คำสั่งซึ่งหมายความว่าสามารถใช้COPY /S
กับ "บวก" ไวยากรณ์ที่จะขจัดความจำเป็นในการที่FOR
เสื้อคลุม แต่นั่นก็ยังทำให้ชีวิตตัวเองลำบากโดยไม่จำเป็นเนื่องจาก TCC / LE มีคำสั่ง TOUCH ในตัวที่รองรับ/S
ตัวเลือกโดยตรง
COPY /B file+,,
วิธีที่จะไปไม่ต้องใช้บริการพิเศษ ... :-)
(ls file).LastWriteTime = DateTime.now
หากต้องการใช้ฟังก์ชันการทำงานของ Windows ที่มีอยู่เท่านั้น (ไม่มีอะไรพิเศษให้ติดตั้ง) ลองทำสิ่งใดสิ่งหนึ่งต่อไปนี้:
forfiles /P C:\Path\To\Root /S /C "cmd /c Copy /B @path+,,"
(เรียกซ้ำ "สัมผัส" ไฟล์ทั้งหมดที่เริ่มต้นในเส้นทางที่ระบุ)
หรือ
forfiles /S /C "cmd /c Copy /B @path+,,"
(เรียกซ้ำ "สัมผัส" ไฟล์ทั้งหมดที่เริ่มต้นในไดเรกทอรีปัจจุบัน)
ฉันรู้ว่านี่อาจจะสายเกินไป แต่ฉันจะทิ้งคำตอบไว้ในกรณีที่คนอื่นต้องการสิ่งเดียวกัน
คำตอบของ John T ไม่ได้ผลสำหรับฉันใน Windows 7 หลังจากการวิจัยบางอย่างฉันพบอรรถประโยชน์นี้ชื่อSKTimeStampซึ่งทำงานได้อย่างสมบูรณ์แบบ
นี่คือบทความที่มีรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำงาน: http://www.trickyways.com/2009/08/how-to-change-timestamp-of-a-file-in-windows-file-created-modified-and -accessed /
นี่คือขั้นตอนที่คุณต้องดำเนินการ:
Voila! อัปเดตไฟล์ทั้งหมดของคุณแล้ว! ไม่จำเป็นต้องใช้ utiles หรือบรรทัดคำสั่งใด ๆ
หรือคุณสามารถใช้เครื่องมือที่มีอยู่แล้วใน Windows เมื่อคุณมีเครื่องมือ "สัมผัส" อยู่แล้ว:
for /r %i in (C:\Path\To\Root\*) do @touch "%i"
หรือ
forfiles /P C:\Path\To\Root /S /C "touch @file"
(หมายเหตุ: หากคุณทำเช่นนี้จากแบตช์ไฟล์และต้องการใช้for
คำสั่งตรวจสอบให้แน่ใจว่าได้ใช้เครื่องหมายสองเปอร์เซ็นต์สำหรับตัวแปรของคุณ (เช่น%%i
แทน%i
)
มันล้มเหลวใน Windows 7 สำหรับฉันด้วย ฉันใช้ไวยากรณ์ที่แตกต่างกันและทำให้การทำงาน:
forfiles /c "cmd /c touch @file"
หมายเหตุฉันไม่ได้ใช้ตัวเลือกการเรียกคืนเงิน
ใช้ PowerShell:
C:\> powershell (ls your-file-name-here).LastWriteTime = Get-Date
The property 'LastWriteTime' cannot be found on this object.
จากการอ้างอิงถึงคำตอบของ John T ด้านบน:
ฉันพยายามที่จะเข้าใจความแตกต่างระหว่างการสิ้นสุดfind
คำสั่ง exec กับ a \;
และ `+ '(ฉันไม่ทราบหลัง)
สิ่งนี้มีประโยชน์: (จากที่นี่ )
-exec command ;
ดำเนินการคำสั่ง; เป็นจริงถ้าส่งคืนสถานะ 0 อาร์กิวเมนต์ทั้งหมดต่อไปนี้เพื่อค้นหาจะถูกนำไปเป็นอาร์กิวเมนต์กับคำสั่งจนกว่าอาร์กิวเมนต์ประกอบด้วย ';' พบ สตริง '{}' ถูกแทนที่ด้วยชื่อไฟล์ปัจจุบันที่ถูกประมวลผลทุกที่ที่เกิดขึ้นในอาร์กิวเมนต์ของคำสั่งไม่ใช่เฉพาะในอาร์กิวเมนต์ที่อยู่คนเดียวเช่นเดียวกับในบางรุ่นของการค้นหา
-exec command {} +
ตัวแปรของแอ็คชัน -exec นี้รันคำสั่งที่ระบุบนไฟล์ที่เลือก แต่บรรทัดคำสั่งถูกสร้างโดยการต่อท้ายชื่อไฟล์ที่เลือกแต่ละชื่อที่ท้าย จำนวนการเรียกใช้คำสั่งทั้งหมดจะน้อยกว่าจำนวนไฟล์ที่ตรงกัน บรรทัดคำสั่งถูกสร้างขึ้นในลักษณะเดียวกับที่ xargs สร้างบรรทัดคำสั่ง อนุญาตเพียงหนึ่งอินสแตนซ์ของ '{}' ภายในคำสั่ง คำสั่งจะถูกดำเนินการในไดเรกทอรีเริ่มต้น
พิจารณาโฟลเดอร์c:\myfolder
ที่มี 2 ไฟล์a.txt
และb.txt
find . -type f -exec touch {} +
ถูกตีความว่าเป็น: touch a.txt b.txt
find . -type f -exec touch {} \;
ตีความว่า:touch a.txt
touch b.txt
ดังนั้น # 1 จะเร็วกว่ามาก (แต่ยังต้องทนทุกข์ทรมานจากข้อ จำกัด ที่คำสั่งต่อไปนี้exec
สามารถมี{}
ตัวยึดตำแหน่งเดียวเท่านั้น)
การใช้ PowerShell สำหรับไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยทั้งหมด:
dir -R | foreach { $_.LastWriteTime = [System.DateTime]::Now }
dir
หรือคุณสามารถระบุโฟลเดอร์ขวาหลังจาก