作者:吳祐賓
使用 Node.js 練習開發 JavaScript 專案時,或多或少會遇到需要刪除 node_modules 目錄的情況。以 create-react-app 為例,安裝完成時,node_modules 就有 39,674 個檔案,5,060 個資料夾,約 234 MB。檔案大小估且不計,但 39,674 個檔案光是刪除就要花很多的時間。
糟糕的刪除方式
Windows 常見的刪除有 2 種:移至資源回收筒、檔案總管下 Shift+ DELETE 直接刪除。這 2 種都是糟糕到不行的刪除方式。
移至資源回收筒
搬到資源回收筒目錄,還需要再刪除一次。
檔案總管下 Shift+ DELETE 直接刪除
刪除資料前還需為花費大量時間為每個檔案進行檢查。
除了刪除 node_modules 之外,如果你的目錄也是零碎檔案很多時,也會有相同的問題。這似乎是 Windows 的問題,有沒有可以解決刪除花費大量時間的方法呢?答案是有的,而且還有 2 種:使用 npm rimraf、使用 dos command。
2 種快速删除 node_modules 的方法
使用 npm rimraf
isaacs 製作了名叫 "rimraf" 的 npm 套件,作者對此套件的說明如下:
The UNIX command rm -rf for node.
Install with npm install rimraf.
作者復刻 Unix 的 rm 指令(remove),藉由 npm 的架構,讓此套件能跨平台使用。
rimraf 安裝
npm install rimraf -g # 可全域使用
rimraf 使用
rimraf node_modules # 移除 node_modules 目錄
使用 Dos Command
上述內容可以知道使用 Windows 檔案總管刪除資料並不是這麼理想,不過使用 Dos Command 可是非常有效率的,你可以使用 rmdir /s/q [FolderName] 刪除整個目錄其指令;或使用 del /f/s/q [FolderName] 刪除所有檔案,只是 del 的指令仍會保留目錄及子目錄結構。整理之後的指令如下:
del /f/s/q node_modules > nul
rmdir /s/q node_modules
nul 的用意是不要把刪除的流程顯示出來,盡可能地加快刪除效率。
StackOverflow 有網友測試了 WinXP 加密磁碟下刪除了 30GB / 1,000,000 個檔案 / 15,000 個資料夾,rmdir 使用約 2.5 小時;del + rmdir 則約 53 分鐘。
於是可以將以上指令濃縮在一行處理:
del /f/s/q node_modules > nul && rmdir /s/q node_modules
可以確保刪除 node_modeuls 內檔案成功後,再刪除 node_modeuls 資料夾結構。
del 命令說明:
- /f - 強制刪除 (僅管是唯讀的)
- /s - 遞迴子資料夾
- /q - 安靜執行 (不會有提示給使用者確認)
rmdir 命令說明:
- /s - 遞迴子資料夾 (和 del /s 參數指令相同)
- /q - 安靜執行 (和 del /q 參數指令相同)
製作 rm.bat 快速刪除指定資料夾
REM rm.bat @echo off if "%1"=="" ( echo Usage: rm.bat ^<directory^> exit /b 1 ) set "target_directory=%1" echo Deleting %target_directory%... del /f /s /q "%target_directory%" > nul rmdir /s /q "%target_directory%" echo Cleanup complete. exit /b 0
結論
本文介紹 Windows 刪除檔案最常用的方式在刪除 node_modules 目錄時會引發可能的災難。進而說明更有效率的刪除方式有 npm rimraf 和 Dos Command 兩種方式。rimraf 可以讓刪除功能在各家平台都能保持其一致性,Dos Command 則能在 Windows 平台下發揮其最大效能。我個人會偏好使用 Dos Command 並使用批次檔讓執行變得更加容易。不過我相信您在看完這份文件後也可以挑選出適合您的方案。有任何想法都歡迎留言。
和你分享。
See also
- What's the fastest way to delete a large folder in Windows?
- windows下快速删除node_modules
- 文首圖片來源:攝影師:Pixabay: https://www.pexels.com/zh-tw/photo/40784/
沒有留言:
張貼留言