Jawaban "diterima" di tautan itu adalah tentang menggunakan pustaka pemrograman .NET untuk menyelesaikannya untuk satu file. Yang lain adalah tentang menambahkan menu konteks untuk memperbarui file tunggal. Saya sedang mencari perintah bawaan untuk melakukannya ke N file secara rekursif. Jawaban di bawah berfungsi untuk melakukannya untuk semua file. Ini bukan built-in, tetapi berfungsi. Terima kasih.
jmq
Ini juga bukan duplikat dari versi Windows dari perintah sentuh Unix , karena pertanyaan ini meminta rekursi khusus. Namun, perhatikan bahwa beberapa jawaban untuk pertanyaan itu memiliki bentuk rekursif.
JdeBP
Jawaban:
19
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.
+1, COPY /B file+,,adalah jalan yang harus dilalui, tidak memerlukan tambahan ... :-)
Tamara Wijsman
3
Cara Powershell:(ls file).LastWriteTime = DateTime.now
Tamara Wijsman
5
Karena sudah tersedia, saya akan merekomendasikan mengambil keuntungan dari unxutils . Mereka menyertakan finddan touchperintah yang akan membuat ini sangat mudah.
Setelah mengubah ke direktori paling atas yang ingin Anda ubah:
-1 As-adalah perintah ini menyalin file dari subfolder ke root dan hasilnya berantakan.
TonyG
1
+1 Sedikit putaran untuk memperbaiki apa yang dikatakan @TonyG: forfiles / S / C "cmd / c Salin / B nul: + ,,"
Alex Dupuis
tidak mengubah yang terakhir diubah
beppe9000
4
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.
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)
-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.txt Ini mirip dengan cara kerja xargs
sedangkan 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 exechanya memiliki satu {}placeholder).
Jawaban:
Ada beberapa kemungkinan:
Gunakan port dari
touch
perintah Unix dan cukup gabungkanfind
dantouch
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, darimv
dandu
, melalui cangkang Korn dan C, untukperl
danawk
. Muncul dalam rasa x86-64 dan IA64 serta x86-32. Program-program berjalan di lingkungan POSIX asli Windows yang asli, daripada dengan emulator DLL (seperticygwin1.dll
) meletakan sesuatu di atas Win32. Dan ya, toolkit ini memilikitouch
danfind
, 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 Unixfind
untuk membungkusnya. (Mereka, bagaimanapun, menargetkan basis pengguna yang mencaritouch
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 denganFOR /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 yangCOPY
perintah , yang berarti bahwa orang bisa menggunakanCOPY /S
dengan "plus" sintaks untuk menghilangkan kebutuhan untukFOR
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.sumber
COPY /B file+,,
adalah jalan yang harus dilalui, tidak memerlukan tambahan ... :-)(ls file).LastWriteTime = DateTime.now
Karena sudah tersedia, saya akan merekomendasikan mengambil keuntungan dari unxutils . Mereka menyertakan
find
dantouch
perintah yang akan membuat ini sangat mudah.Setelah mengubah ke direktori paling atas yang ingin Anda ubah:
sumber
Untuk hanya menggunakan fungsionalitas Windows yang ada (tidak ada tambahan untuk menginstal) coba salah satu dari ini:
("sentuh" secara rekursif semua file dimulai pada jalur yang ditentukan)
ATAU
("sentuh" secara rekursif semua file mulai dari direktori saat ini)
sumber
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.
sumber
Atau Anda dapat menggunakan alat yang sudah ada di dalam Windows, setelah Anda memiliki alat "sentuhan" dari beberapa jenis:
ATAU
(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
)sumber
Gagal juga pada Windows 7 untuk saya. Saya menggunakan sintaks yang berbeda dan mulai bekerja:
Catatan, saya tidak menggunakan opsi perulangan.
sumber
Menggunakan PowerShell:
sumber
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 filea.txt
danb.txt
find . -type f -exec touch {} +
ditafsirkan sebagai:touch a.txt b.txt
Ini mirip dengan cara kerja xargs
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).sumber
Menggunakan PowerShell untuk direktori saat ini dan semua sub-direktori:
Atau Anda dapat menentukan folder setelahnya
dir
.sumber