利用 find 搜尋指定檔案並批次刪除

很多時候,我們從網路下載的各種作業系統的 ISO 檔案,在安裝之後,就可以刪除了,要用時再次下載即可。但若一時忘記而擺著,一般只是徒佔磁碟空間罷了,哪天磁碟空間不夠用了,就構成「必須刪除以回收空間」的困擾。用檔案管理員之類的 GUI 一個一個找、一個一個刪嗎?當然不是,可以打幾個指令,指令替你找,替你刪,一次解決。

# 【操作環境】

# 系統:openSUSE Leap 42.3 KDE Plasma 5
# Shell Script:GNU bash, version 4.3.42
# 終端機:Konsole 版本 17.04.2


一、搜尋指定檔案:使用 find 搜尋指定檔案

但是這些文件可能散落在磁碟的不同地方,得先找它們一齊找出來才行,如果能一個指令就找出全部符合條件的檔案,當然省事。幸好 Linux 提供了強大的搜尋指令 find,於是,打開終端機,動用 find 指令吧!

find / -type f -iname "*.iso" 2>/dev/null
/ : 搜尋整個 Root 區;不然就指定目錄,如:/downloads;或者直接進入工作目錄,指定在 ./ 搜尋
-type f : 僅針對檔案搜尋
-iname : 忽略大小寫
2>/dev/null : 丢棄錯誤訊息不予顯示

結果:

user@linux-b5sa:~> find / -type f -iname “*.iso” 2>/dev/null
/Data2/OS/archlinux-2018.01.01-x86_64.iso
/Data2/OS/Fedora-Workstation-Live-x86_64-27-1.6.iso
/Data2/OS/Boot_Tools.iso
/Data2/OS/deepin-15.5-amd64.iso
/Data2/OS/openSUSE-Leap-42.3-DVD-x86_64.iso
/Data2/OS/openSUSE-13.2-KDE-Live-x86_64.iso
/Data2/OS/Mageia-6-LiveDVD-Plasma-x86_64-DVD.iso
/Data2/OS/elementaryos-0.4.1-stable.20170814.iso
/MyHome/isoboot/openSUSE-Leap-42.3-DVD-x86_64.iso
/mnt/ISO/SLITAZ.ISO
/home/user/.config/VirtualBox/VBoxGuestAdditions_5.1.32.iso
/home/user/下載/InstallCD/archlinux-2018.02.01-x86_64.iso
/home/user/下載/InstallCD/PE_BIOS+UEFI.iso

二、查看檔案大小:搭配 du 查看每個檔案的大小

想要順便知道各檔案大小,好大略判斷佔用多少磁碟空間,那可以配合 du 指令。du,disk usage,查看資料夾或檔案磁碟用量的指令。

find / -type f -iname "*.iso" 2>/dev/null -exec du -BM {} +
-exec : 這個參數後面要接一個指令,前面的結果交給後面的指令執行
-exec du {} + : 把前面 find 所得結果,交給 du 指令查看大小
-BM : 以 Megabyte 格式顯示大小
{} + : 將前面的結果一一置入

結果:

user@linux-b5sa:~> find / -type f -iname “*.iso” 2>/dev/null -exec du -BM {} +
523M /Data2/OS/archlinux-2018.01.01-x86_64.iso
1557M /Data2/OS/Fedora-Workstation-Live-x86_64-27-1.6.iso
734M /Data2/OS/Boot_Tools.iso
3267M /Data2/OS/deepin-15.5-amd64.iso
4426M /Data2/OS/openSUSE-Leap-42.3-DVD-x86_64.iso
909M /Data2/OS/openSUSE-13.2-KDE-Live-x86_64.iso
2506M /Data2/OS/Mageia-6-LiveDVD-Plasma-x86_64-DVD.iso
1303M /Data2/OS/elementaryos-0.4.1-stable.20170814.iso
4426M /MyHome/isoboot/openSUSE-Leap-42.3-DVD-x86_64.iso
78M /mnt/ISO/SLITAZ.ISO
57M /home/user/.config/VirtualBox/VBoxGuestAdditions_5.1.32.iso
540M /home/user/下載/InstallCD/archlinux-2018.02.01-x86_64.iso
734M /home/user/下載/InstallCD/PE_BIOS+UEFI.iso

三、找到順便砍了:搭配 -exec 或 xargs 和 rm 指令,把找到的結果一個一個都刪掉

find / -type f -iname "*.iso" 2>/dev/null -exec rm -f {} +

find / -type f -iname "*.iso" 2>/dev/null | xargs rm -f {} +
xargs : 透過通道符號|接收前面的結果,再分配給後面的指令處理
rm -f : 忽略所有錯誤訊息並直接刪除,不做確認

結果:

…… 結果當然是找到的 ISO 檔全砍了 ……

所以使用 -exec 參數或 xargs 搭配 rm 刪除指令,一定要先確認結果無誤才加上 rm 指令(無論有無 -f 參數),不然是欲哭無淚的。

四、同時執行幾個搜尋條件:使用 bash 可執行文件

一個條件一條指令就完成搜尋加刪除很方便,我想砍掉 iso、zip、rar、rpm、… 幾個條件就幾個指令,也很方便。

find / -type f -iname "*.iso" 2>/dev/null -exec rm -f {} +
find / -type f -iname "*.zip" 2>/dev/null -exec rm -f {} +
find / -type f -iname "*.rar" 2>/dev/null | xargs rm -f {} +
find / -type f -iname "*.rpm" 2>/dev/null | xargs rm -f {} +

人性本懶,如果能一個指令就同時執行幾個搜尋條件並刪除,就更好了。那麼是把幾行指令用「;」分號隔開而寫成一行嗎?好長咧!

有個方法,用 sh 文件來執行,把這幾行指令寫進一個 xxx.sh 文件,然後設定成「可執行檔」執行,或下指令 bash xxx.sh 執行也行。

當然還有更進階的,可以使用 array 陣列來處理同時多個搜尋條件,但執行同樣指令的情況,然而這牽涉到 bash script 程式碼編寫,更複雜了些,容後再談。

進階閱讀:「利用 find 搜尋指定檔案並批次刪除,使用 array 陣列

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *