在 Linux 目錄中「保留特定檔案,刪除其餘所有檔案」是常見的清理需求。本文提供 5 種不同複雜度與適用場景的方法,從簡單的 Shell 擴展到強大的 find 組合,總有一款適合你的場景。
rm filenamerm -rf dirnamermdir dirnamemkdir -p /tmp/backup
mv keep_file /tmp/backup/ # 移動需保留的檔案/目錄到暫存區
rm -rf * # 刪除當前目錄所有內容
mv /tmp/backup/keep_file ./ # 移回原位
rmdir /tmp/backup
優點:邏輯清晰,不需記憶特殊語法。
缺點:需額外磁碟空間與移動時間;大量檔案時較慢。
!(pattern) (最快捷,需啟用 extglob)shopt -s extglob # 啟用擴展模式 (bash 預設通常已開啟)
rm -rf !(keep_file) # 刪除除 keep_file 外的所有檔案
rm -rf !(keep1|keep2) # 保留多個檔案/目錄
注意:! 為模式否定,| 為或條件。此法僅適用於當前目錄,不遞迴子目錄。
ls + grep -v + xargs (經典管道組合)ls | grep -v '^keep_file$' | xargs rm -rf
解析:
ls 列出檔名 → grep -v 排除完全匹配 keep_file 的行 → xargs rm -rf 批次刪除。
優點:支援正則表達式,可精準匹配複雜檔名模式。
缺點:檔名含空白、換行等特殊字元時 xargs 可能出錯 (建議改用 xargs -d '\n' 或 find -print0 | xargs -0)。
find + grep -v + xargs (可指定目標目錄)find ./test_dir -maxdepth 1 -type f | grep -v 'keep_file' | xargs rm -f
改進點:find 可指定任意目錄 (./test_dir),-maxdepth 1 僅處理第一層,-type f 僅匹配檔案 (不含目錄)。更精確可控。
find 配合 -name 模式否定 (最高效,單一進程)# 刪除不以 keep 開頭的檔案
find . -maxdepth 1 -type f ! -name 'keep*' -delete
# 或使用 regex (更靈活)
find . -maxdepth 1 -type f ! -regex './keep.*' -delete
優點:
1. find 內建 -delete 動作,單一進程完成遍歷與刪除,效能最佳。
2. 支援 -maxdepth、-type、-name、-regex 等豐富條件組合。
3. 正確處理特殊字元檔名,無需擔心 xargs 分隔符問題。
推薦:生產環境大量檔案清理首選。
# 保留所有 .log 檔案,刪除其他
find . -maxdepth 1 -type f ! -name '*.log' -delete
# 保留 7 天內修改過的檔案,刪除更舊的
find . -maxdepth 1 -type f -mtime +7 -delete
# 組合:刪除 30 天前且非 .bak 的檔案
find . -maxdepth 1 -type f -mtime +30 ! -name '*.bak' -delete
-delete 或 rm 替換為 ls 或 echo 確認匹配列表無誤後再執行刪除。.* 隱藏檔:上述指令預設不匹配隱藏檔 (以 . 開頭),若需包含隱藏檔請調整模式或加上 -name '.*' 條件。根據檔案量、檔名複雜度、是否需要遞迴子目錄、腳本自動化需求,選擇最適合的方法。日常互動操作推薦 方法二;腳本自動化與大量檔案清理首選 方法五。
Ubuntu 安裝 Nvidia Optimus 雙顯卡切換驅動 (nvidia-prime) 完整指南
Vim 進階編輯完全指南:set 配置、.vimrc 管理、外部命令整合與縮寫系統
Linux tar 命令完整實戰指南:打包、壓縮、排除與目錄切換
Linux Vim 安裝 YouCompleteMe 程式碼補全外掛:Vundle 管理、Python 支援編譯、Clangd 語義補全完整流程
Ubuntu 與 Windows 局域網互訪共享檔案:Samba 無密碼與密碼保護兩種模式完整配置
Ubuntu 軟體中心出現 Debconf 視窗導致安裝失敗:oracle-java7-installer 衝突完整解決