Di Windows 7, bagaimana saya bisa menyentuh semua file secara rekursif dalam direktori (termasuk subdirektori) untuk memperbarui cap tanggal / waktu?
Apakah Windows 7 memiliki mekanisme untuk melakukan ini?
Di Windows 7, bagaimana saya bisa menyentuh semua file secara rekursif dalam direktori (termasuk subdirektori) untuk memperbarui cap tanggal / waktu?
Apakah Windows 7 memiliki mekanisme untuk melakukan ini?
Jawaban:
Ada beberapa kemungkinan:
Gunakan port dari touchperintah Unix dan cukup gabungkan finddan touchdengan cara Unix. Ada beberapa pilihan. Oft-disebutkan adalah GNUWin32 , cygwin , dan unxutils . Yang kurang terkenal, tetapi dalam beberapa hal lebih baik, adalah alat-alat dalam toolkit utilitas SFUA , yang berjalan di Subsistem untuk Aplikasi berbasis UNIX yang hadir di sana dalam kotak dengan Windows 7 Ultimate edition dan Windows Server 2008 R2. (Untuk Windows XP, seseorang dapat mengunduh dan menginstal Layanan untuk UNIX versi 3.5 .) Toolkit ini memiliki sejumlah besar alat TUI baris perintah, dari mvdan du, melalui cangkang Korn dan C, untukperldan awk. Muncul dalam rasa x86-64 dan IA64 serta x86-32. Program-program berjalan di lingkungan POSIX asli Windows yang asli, daripada dengan emulator DLL (seperti cygwin1.dll) meletakan sesuatu di atas Win32. Dan ya, toolkit ini memiliki touchdan find, serta sekitar 300 lainnya.
Semua toolkit ini memiliki kelemahan terkenal menjalankan proses terpisah untuk setiap file yang akan disentuh, tentu saja. Itu bukan masalah dengan alternatif berikut.
Gunakan salah satu dari banyak touchperintah Win32 asli yang telah ditulis dan diterbitkan orang. Banyak dari mereka mendukung opsi untuk melakukan rekursi, tanpa keharusan bagi Unix finduntuk membungkusnya. (Mereka, bagaimanapun, menargetkan basis pengguna yang mencari touchperintah karena tidak memiliki seluruh beban perintah Unix porting.) Salah satunya adalah Stéphane Duguaytouch yang seperti yang Anda lihat memiliki --recursivepilihan.
Pandai dengan misteri misterius CMD. Seperti disebutkan dalam jawaban lain, COPY /B myfile+,,akan memperbarui datestamp modifikasi file terakhir, menggunakan sintaks "plus" COPYperintah yang kurang diketahui (lebih banyak yang dapat ditemukan di sini , secara tidak sengaja). Ini tentu saja dapat dikombinasikan dengan FOR /Runtuk melakukan operasi secara rekursif, seperti yang ditunjukkan dalam jawaban lain di sini.
Gunakan juru bahasa pengganti perintah dan menjadi kurang pintar dan lebih mudah daripada CMD. TCC / LE Perangkat Lunak JP adalah salah satunya. Itu menambah /Spilihan untuk yang COPYperintah , yang berarti bahwa orang bisa menggunakan COPY /Sdengan "plus" sintaks untuk menghilangkan kebutuhan untuk FORpembungkus. Tapi itu benar-benar masih membuat hidup tidak perlu sulit untuk diri sendiri, mengingat bahwa TCC / LE memiliki perintah TOUCH bawaan yang secara langsung mendukung /Sopsi.
COPY /B file+,,adalah jalan yang harus dilalui, tidak memerlukan tambahan ... :-)
(ls file).LastWriteTime = DateTime.now
Untuk hanya menggunakan fungsionalitas Windows yang ada (tidak ada tambahan untuk menginstal) coba salah satu dari ini:
forfiles /P C:\Path\To\Root /S /C "cmd /c Copy /B @path+,,"
("sentuh" secara rekursif semua file dimulai pada jalur yang ditentukan)
ATAU
forfiles /S /C "cmd /c Copy /B @path+,,"
("sentuh" secara rekursif semua file mulai dari direktori saat ini)
Saya tahu ini mungkin agak terlambat tetapi bagaimanapun, saya akan meninggalkan jawaban saya kalau-kalau ada orang lain yang membutuhkan hal yang sama.
Jawaban John T tidak bekerja untuk saya di Windows 7. Setelah beberapa penelitian saya menemukan utilitas ini disebut SKTimeStamp , yang melakukan pekerjaan dengan sempurna.
Inilah artikel dengan rincian lebih lanjut tentang cara kerjanya: http://www.trickyways.com/2009/08/how-to-change-timestamp-of-a-file-in-windows-file-created-modified-and -akses / .
Berikut langkah-langkah yang perlu Anda lakukan:
Voila! Semua file Anda telah diperbarui! Tidak perlu utils utix atau baris perintah.
Atau Anda dapat menggunakan alat yang sudah ada di dalam Windows, setelah Anda memiliki alat "sentuhan" dari beberapa jenis:
for /r %i in (C:\Path\To\Root\*) do @touch "%i"
ATAU
forfiles /P C:\Path\To\Root /S /C "touch @file"
(NB: Jika Anda melakukan ini dari file batch dan ingin menggunakan forperintah, pastikan untuk menggunakan tanda dua persen untuk variabel Anda. (Misal %%ialih-alih %i)
Menggunakan PowerShell:
C:\> powershell (ls your-file-name-here).LastWriteTime = Get-Date
The property 'LastWriteTime' cannot be found on this object.
Mengacu pada jawaban John T di atas:
Saya mencoba memahami perbedaan antara mengakhiri findperintah exec dengan a \;dan `+ '(saya belum tahu yang terakhir).
Ini berguna: (dari sini )
-exec command ;
Jalankan perintah; true jika 0 status dikembalikan. Semua argumen berikut untuk ditemukan dianggap sebagai argumen untuk perintah sampai argumen yang terdiri dari ';' ditemui. String '{}' diganti dengan nama file saat ini sedang diproses di mana-mana itu terjadi dalam argumen ke perintah, tidak hanya dalam argumen di mana itu sendirian, seperti dalam beberapa versi find.
-exec command {} +
Varian aksi -exec ini menjalankan perintah yang ditentukan pada file yang dipilih, tetapi baris perintah dibangun dengan menambahkan setiap nama file yang dipilih di akhir; jumlah total doa perintah akan jauh lebih sedikit daripada jumlah file yang cocok. Baris perintah dibangun dengan cara yang sama seperti xargs membangun baris perintahnya. Hanya satu instance dari '{}' diizinkan dalam perintah. Perintah dijalankan di direktori awal.
Pertimbangkan folder yang c:\myfolderberisi 2 file a.txtdanb.txt
find . -type f -exec touch {} +ditafsirkan sebagai: touch a.txt b.txtfind . -type f -exec touch {} \;diartikan sebagai:touch a.txttouch b.txtDengan demikian, # 1 jauh lebih cepat (tetapi juga menderita keterbatasan bahwa perintah berikut exechanya memiliki satu {}placeholder).