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 touch
perintah Unix dan cukup gabungkan find
dan touch
dengan 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 mv
dan du
, melalui cangkang Korn dan C, untukperl
dan 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 touch
dan 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 touch
perintah Win32 asli yang telah ditulis dan diterbitkan orang. Banyak dari mereka mendukung opsi untuk melakukan rekursi, tanpa keharusan bagi Unix find
untuk membungkusnya. (Mereka, bagaimanapun, menargetkan basis pengguna yang mencari touch
perintah karena tidak memiliki seluruh beban perintah Unix porting.) Salah satunya adalah Stéphane Duguaytouch
yang seperti yang Anda lihat memiliki --recursive
pilihan.
Pandai dengan misteri misterius CMD. Seperti disebutkan dalam jawaban lain, COPY /B myfile+,,
akan memperbarui datestamp modifikasi file terakhir, menggunakan sintaks "plus" COPY
perintah yang kurang diketahui (lebih banyak yang dapat ditemukan di sini , secara tidak sengaja). Ini tentu saja dapat dikombinasikan dengan FOR /R
untuk 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 /S
pilihan untuk yang COPY
perintah , yang berarti bahwa orang bisa menggunakan COPY /S
dengan "plus" sintaks untuk menghilangkan kebutuhan untuk FOR
pembungkus. 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 /S
opsi.
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 for
perintah, pastikan untuk menggunakan tanda dua persen untuk variabel Anda. (Misal %%i
alih-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 find
perintah 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:\myfolder
berisi 2 file a.txt
danb.txt
find . -type f -exec touch {} +
ditafsirkan sebagai: touch a.txt b.txt
find . -type f -exec touch {} \;
diartikan sebagai:touch a.txt
touch b.txt
Dengan demikian, # 1 jauh lebih cepat (tetapi juga menderita keterbatasan bahwa perintah berikut exec
hanya memiliki satu {}
placeholder).