刪除目錄中除擴展名為pdf的檔案之外的所有文件

刪除目錄中除擴展名為pdf的檔案之外的所有文件

我有一個包含以下內容的目錄:

x.pdf
y.zip
z.mp3
a.pdf

我想刪除除 和 之外的所有x.pdf文件a.pdf。我如何從終端執行此操作?沒有子目錄,因此不需要任何遞迴。

答案1

cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
  • 第一個命令將帶您進入要刪除檔案的目錄
  • 第二個指令將刪除除以.pdfin 檔案名稱結尾的檔案以外的所有文件

例如,如果您的主資料夾中有一個目錄temp

cd ~/temp

然後刪除檔案:

find . -type f ! -iname "*.pdf" -delete

這將刪除除xyz.pdf.

您可以將這兩個命令組合起來:

find ~/temp -type f ! -iname "*.pdf" -delete

.是當前目錄。!表示取得除.pdf末尾帶有 的文件之外的所有文件。-type f僅選擇文件,不選擇目錄。-delete意思是刪除它。

注意:此命令將刪除目前目錄以及所有子目錄中的所有檔案(pdf 檔案除外,但包括隱藏檔案)。!必須先來-name。 simple-name只包含.pdf,而-iname同時包含.pdf.PDF

若要僅刪除目前目錄而不刪除子目錄,請新增-maxdepth 1

find . -maxdepth 1 -type f ! -iname "*.pdf" -delete

答案2

通過bash的擴展 shell 通配,您可以刪除任何具有使用.pdf之外的擴展名的文件

rm -- *.!(pdf)

正如 @pts 所指出的,這些--字元表示任何命令選項的結尾,在極少數檔案名稱以字元開頭的情況下,使命令安全-

如果您想刪除沒有任何擴展名的文件以及擴展名不是 的文件.pdf,那麼正如 @DennisWilliamson 所指出的,您可以使用

rm -- !(*.pdf)

預設應啟用擴充通配符,但如果沒有,您可以使用

shopt -s extglob

特別是如果您打算在腳本中使用它,請務必注意,如果表達式與任何內容都不匹配(即,如果目錄中沒有非 pdf 文件),那麼預設情況下,glob 將未展開地傳遞到rm命令,導致類似的錯誤

rm: cannot remove `*.!(pdf)': No such file or directory

您可以使用 shell 選項修改此預設行為nullglob,但這有其自身的問題。更深入的討論請參見NullGlob - Greg 維基百科

答案3

刪除到垃圾箱:

$ cd <the directory you want>
$ gvfs-trash !(*.pdf)

或透過mv命令(但透過這種方式,您無法從垃圾箱中恢復它,因為它不記錄 .trashinfo 信息,所以這意味著您將文件移動到目的地如下)。

mv !(*.pdf) ~/.local/share/Trash/files

答案4

使用 bash 的 GLOBIGNORE:

GLOBIGNORE=x.pdf:a.pdf
rm *
unset GLOBIGNORE

來自 bash 的手冊頁:

格洛比諾:

            定義該集合的以冒號分隔的模式列表
            路徑名擴充忽略的檔案名稱。

快速測試:

mkdir /tmp/foooooo
cd /tmp/foooooo
touch x.pdf y.zip z.mp3 a.pdf
GLOBIGNORE=x.pdf:a.pdf
ls -1 *

輸出:

y.zip
mp3

相關內容