Perintah sentuh rekursif Windows

17

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?

jmq
sumber
mungkin duplikat Windows setara dengan perintah 'sentuhan' Linux?
Dijeda sampai pemberitahuan lebih lanjut.
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.

JdeBP
sumber
2
+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:

Temukan . -type f -tek sentuh {} +
John T
sumber
5

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)

Sven Roepke
sumber
3
-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.

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:

  • Instal aplikasi
  • Buka direktori tempat Anda perlu mengubah stempel waktu
  • Cari * di kotak pencarian sehingga penjelajah menunjukkan semua file
  • Ketika semua file ditemukan, pilih semuanya, klik kanan padanya dan pilih Properties
  • Dalam dialog pilih tab TimeStamps
  • Sesuaikan tanggal dan waktu Anda sesuai kebutuhan dan klik Touch

Voila! Semua file Anda telah diperbarui! Tidak perlu utils utix atau baris perintah.

Andris
sumber
1

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)

afrazier
sumber
1

Gagal juga pada Windows 7 untuk saya. Saya menggunakan sintaks yang berbeda dan mulai bekerja:

forfiles /c "cmd /c touch @file"

Catatan, saya tidak menggunakan opsi perulangan.

jemiah
sumber
1

Menggunakan PowerShell:

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date
ThiagoAlves
sumber
Ini tidak berfungsi untuk saya:The property 'LastWriteTime' cannot be found on this object.
Ben N
Ini bekerja untuk saya di Windows Server 2012: (ls. \ Backup_db_20150810.sql) .LastWriteTime = Get-Date
ThiagoAlves
0

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

  1. find . -type f -exec touch {} +ditafsirkan sebagai:
    touch a.txt b.txt
    Ini mirip dengan cara kerja xargs

  2. 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).

Ashutosh Jindal
sumber
Komentar luar biasa dengan info bagus, tetapi bukan jawaban untuk pertanyaan itu. Akan memberi +1 jika ini adalah komentar.
TonyG
1
:) Saya tidak punya memori untuk membuat posting ini :)
Ashutosh Jindal
0

Menggunakan PowerShell untuk direktori saat ini dan semua sub-direktori:

dir -R | foreach { $_.LastWriteTime = [System.DateTime]::Now }

Atau Anda dapat menentukan folder setelahnya dir.

icl7126
sumber