Linux 命令列刪除指定副檔名檔案

大雄45發表於2022-12-02
導讀 怎樣根據副檔名來刪除多個檔案呢?今天我們來介紹幾種方法。

Linux 命令列刪除指定副檔名檔案Linux 命令列刪除指定副檔名檔案

我們大家都知道,在   中刪除檔案可以使用 rm  :

rm [option] filename

不過,使用上述 刪除檔案的時候,需要知道確切的檔名。那麼怎樣根據副檔名來刪除多個檔案呢?今天我們來介紹幾種方法。

方法1:使用 rm 命令按副檔名刪除檔案

作為演示,假如我們要刪除副檔名為 gif 的所有檔案,可以這樣做:

rm *.gif

不過一般情況下,直接刪除是有風險的,在刪除之前最好先檢查一下:

ls *.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

下面我們拆開來說明下:

  1. find 後面的點 . 表示在當前目錄中搜尋;
  1. -name 選項指定檔案的名稱,我們可以在其中使用正規表示式;
  1. -exec 選項用於對 find 命令的結果執行 bash 命令;
  1. {} 大括號充當匹配檔案結果的佔位符,因此 rm-v {} 將刪除find命令找到的檔案;
  1. 最後,分號結束 
  2.  執行的命令(exec之後的命令),並使用反斜槓 \,以便正確轉義分號。

在下面的文章中可瞭解 find 命令的更多例子:

使用 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 命令會更容易,實際上也是這樣的...

原文來自:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2924712/,如需轉載,請註明出處,否則將追究法律責任。

相關文章