
我有一個包含以下內容的目錄:
x.pdf
y.zip
z.mp3
a.pdf
我想刪除除 和 之外的所有x.pdf
文件a.pdf
。我如何從終端執行此操作?沒有子目錄,因此不需要任何遞迴。
答案1
cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
- 第一個命令將帶您進入要刪除檔案的目錄
- 第二個指令將刪除除以
.pdf
in 檔案名稱結尾的檔案以外的所有文件
例如,如果您的主資料夾中有一個目錄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