
我們大家都知道,在 Linux 中刪除文件可以使用 rm 命令:
不過,使用上述命令刪除文件的時候,需要知道確切的文件名。那么怎樣根據文件擴展名來刪除多個文件呢?今天我們來介紹幾種方法。
方法1:使用 rm 命令按擴展名刪除文件
作為演示,假如我們要刪除擴展名為 gif 的所有文件,可以這樣做:
不過一般情況下,直接刪除是有風險的,在刪除之前最好先檢查一下:
通常情況下,我在刪除文件的時候會做如下操作:
$ ls
1.gif 2.gif 3.gif 4.gif a.jpg b.png c.webp
$ ls *.gif
1.gif 2.gif 3.gif 4.gif
$ rm -v *.gif
removed '1.gif'
removed '2.gif'
removed '3.gif'
removed '4.gif'
$ ls
a.jpg b.png c.webp
此外,還可以同時刪除多個擴展名的文件,如下:
$ ls
f1.txt f2.txt f3.txt f4.txt not-txt-file.pdf random.txt
$ rm -v *.txt *.pdf
removed 'f1.txt'
removed 'f2.txt'
removed 'f3.txt'
removed 'f4.txt'
removed 'not-txt-file.pdf'
$ ls
random.txt
在使用 rm 命令的時候,可以使用交互式的 -i 選項,該選項要求在刪除文件之前進行確認。不過這個適用于刪除單個或者幾個文件,如果批量刪除文件,這個選項就不方便了。
像上面的刪除操作,它具體是怎樣工作的呢?答案是使用的通配符。
簡而言之,通配符是用于匹配特定模式的特殊字符。以下是一些常用的通配符:
通配符 | 用途 |
* | 匹配一個或多個匹配項 |
? | 匹配單個 |
[] (方括號) | 指定匹配范圍 |
^ | 從匹配中排除 |
在上面的刪除例子中,我們使用了 * 通配符,這表示它可以匹配任何字符。當你使用 *.gif 的時候,它實際表示的是與 .gif 組合的任何字符,也就是說,它提供了所有以 gif 為擴展名的文件。
* 和擴展名之間的點很重要?
有些人在使用通配符的時候,會這樣寫:*gif,這是不對的。* 和擴展名之間的點 . 至關重要。
看下面的例子,假如我們使用 *gif 來刪除文件,看看會怎樣。
$ ls
1.gif 2.gif 3.gif 4.gif definately-not-a-gif jpg-not-gif not-a-gif
$ rm -v *gif
removed '1.gif'
removed '2.gif'
removed '3.gif'
removed '4.gif'
removed 'definately-not-a-gif'
removed 'jpg-not-gif'
removed 'not-a-gif'
可以看到,除了刪除所有 gif 文件外,它還刪除了文件名中帶有字符串 gif 的文件,盡管它不是文件的擴展名。所以,刪除帶有通配符或正則表達式的文件時,應確保盡可能精確。
方法2:使用find命令遞歸刪除具有特定擴展名的文件?
rm 命令僅刪除當前目錄中的文件。即使使用遞歸選項,它也不會從子目錄中刪除文件。
要遞歸刪除具有特定擴展名的文件,可以組合find命令和rm命令。看下面的例子,在子目錄中也有 .gif 文件:
$ ls *
file_0.gif file_z.txt not-a-gif not-a-txt
dir1:
file_1.gif file_a.txt not-a-gif not-a-txt
dir2:
file_2.gif file_b.txt not-a-gif not-a-txt
dir3:
file_3.gif file_c.txt not-a-gif not-a-txt
dir4:
file_4.gif file_d.txt not-a-gif not-a-txt
要刪除文件,可以使用??find和exec命令??,如下所示:
find . -type f -name "*.gif" -exec
以下是上述命令的輸出:
$ find . -type f -name "*.gif" -exec rm -v {} \;
removed './dir1/file_1.gif'
removed './dir3/file_3.gif'
removed './dir2/file_2.gif'
removed './file_0.gif'
removed './dir4/file_4.gif
下面我們拆開來說明下:
- find 后面的點 . 表示在當前目錄中搜索;
- -name 選項指定文件的名稱,我們可以在其中使用正則表達式;
- -exec 選項用于對 find 命令的結果執行 bash 命令;
- {} 大括號充當匹配文件結果的占位符,因此 rm-v {} 將刪除find命令找到的文件;
- 最后,分號結束 shell 執行的命令(exec之后的命令),并使用反斜杠 \,以便正確轉義分號。
在下面的文章中可了解 find 命令的更多例子:
??關于 find 命令的15個超級有用的例子??
使用 find 命令處理多個擴展名文件?
上面顯示的命令不包括查找具有多個擴展名的文件,如:rm *.gif *.txt
要實現這一點,可以使用 -o 參數,它表示邏輯或運算符,但需要用括號括起來,且必須使用反斜杠 \ 來轉義括號。
$ ls *
file_0.gif file_z.txt not-a-gif not-a-txt
dir1:
file_1.gif file_a.txt not-a-gif not-a-txt
dir2:
file_2.gif file_b.txt not-a-gif not-a-txt
dir3:
file_3.gif file_c.txt not-a-gif not-a-txt
dir4:
file_4.gif file_d.txt not-a-gif not-a-txt
$ find . \( -name "*.gif" -o -name "*.txt" \) -exec rm -v {} \;
removed './dir1/file_1.gif'
removed './dir1/file_a.txt'
removed './dir3/file_3.gif'
removed './dir3/file_c.txt'
removed './dir2/file_2.gif'
removed './dir2/file_b.txt'
removed './file_0.gif'
removed './file_z.txt'
removed './dir4/file_d.txt'
removed './dir4/file_4.gif'
在這里,我們可以看到所有擴展名為 txt 的文件和擴展名為 gif 的文件都被遞歸刪除。
大家可能會覺得對每個文件擴展名類型單獨使用 find 命令會更容易,實際上也是這樣的...