2014-02-14 58 views
14

在Linux終端中,如何刪除除一個或兩個文件夾以外的所有文件?在Linux終端中,如何刪除一個或兩個目錄以外的所有文件

例如。

我有一個目錄圖像文件和一個.txt文件。 我想刪除除.txt文件以外的所有文件。

+0

除了其中一個還是兩個? –

+0

您最好展示一些例外應該如何的模式。否則,我們將只能給出一個非常一般的答案。 – fedorqui

+0

已更新的問題 – Bilal

回答

31

從目錄中,列出文件,過濾掉所有不包含'文件保留',並刪除列表中剩下的所有文件。

ls | grep -v 'file-to-keep' | xargs rm 

爲了避免問題的文件名中使用空格(記住永遠不要使用文件名中的空格),使用find-0選項。

find 'path' -maxdepth 1 -not -name 'file-to-keep' -print0 | xargs -0 rm 

或混合兩種,使用grep選項-zfind

+0

如果文件名中有空格,則可能會出現問題。 –

+0

作品。我必須在當前目錄中才能成功執行此命令。對? – Bilal

+0

我試過這個命令爲'sudo ls directory/directory/directory1/| grep -v'readme.txt'| xargs RM「,但沒有奏效。我必須在許多目錄上運行這個命令。假設我'目錄'有兄弟'目錄2,目錄3'。 – Bilal

8

管理-print0名稱一般情況下,使用使用grep倒置模式搜索應該做的工作。當你沒有定義任何的圖案,我只是給你一個一般的代碼示例:

ls -1 | grep -v 'name_of_file_to_keep.txt' | xargs rm -f 

ls -1列出每行一個文件,這樣的grep可以通過網上搜索線。 grep -v是倒立的旗幟。所以任何匹配的模式都不會被刪除。

對於多個文件,你可以使用egrep的:問題後

ls -1 | grep -E -v 'not_file1.txt|not_file2.txt' | xargs rm -f 

更新進行了更新: 我假設你願意刪除除在當前文件夾中的文件不與.txt結尾的所有文件。所以這應該工作太:

find . -maxdepth 1 -type f -not -name "*.txt" -exec rm -f {} \; 
+0

史詩。乾淨的答案。謝謝。 – moeiscool

3

使用not修改刪除file(s)pattern(s)你不想刪除,你可以修改1傳遞給-maxdepth指定要多少子目錄深刪除文件從

find . -maxdepth 1 -not -name "*.txt" -exec rm -f {} \; 

你也可以這樣做:

find -maxdepth 1 \! -name "*.txt" -exec rm -f {} \; 
4

發現支持-delete選項,所以你不需要-exec。您也可以通過多套-not -name somefile -not -name otherfile

[email protected]$ ls 
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt josh.pdf keepme 

[email protected]$ find . -maxdepth 1 -type f -not -name keepme -not -name 8.txt -delete 

[email protected]$ ls 
8.txt keepme 
2

在bash中,你可以使用:

$ shopt -s extglob # Enable extended pattern matching features  
$ rm !(*.txt)  # Delete all files except .txt files 
相關問題