2011-07-03 37 views
7

我正在使用Linux並打算使用shell刪除某些文件。當名稱不包含某些詞時刪除文件

我在我的文件夾中有一些文件,一些文件名包含單詞「好」,而另一些則沒有。 例如:

ssgood.wmv 
ssbad.wmv 
goodboy.wmv 
cuteboy.wmv 

我想刪除不包含名稱中的「好」的文件,因此剩餘的文件有:

ssgood.wmv 
goodboy.wmv 

如何做到這一點用在外殼rm?我嘗試使用

rm -f *[!good].* 

但它不起作用。

非常感謝!

+2

你的意思是 「文件** **名包含 '好'?」該示例似乎指示文件名,但您確實說「文件包含單詞」... – sarnold

+0

文件*名稱*包含良好。我不是英語母語的人。感謝4個提醒。 – DocWiki

回答

16

這個命令應該做你所需要的:

ls -1 | grep -v 'good' | xargs rm -f 

它可能會跑的比其他命令快,因爲它不涉及使用正則表達式(這是緩慢的,並且不需要這麼簡單操作)。

+1

+1。實際上,'grep'既是正則表達式驅動的,也是非常快速的。 –

+2

按原樣,這是行不通的,因爲'ls'命令每行列出多個文件名。你需要像這樣添加''-1'「_」一行一行「選項:'ls -1 | grep ...' – ridgerunner

+0

嗯......在我的系統中'ls'總是每行列出一個文件,所以它工作的很完美。奇怪的是,這可能是某個地方的默認選項。無論如何,我已經添加了'-1'選項,以便它始終能夠正常工作。 – EdoDodo

4

您可以使用find-not操作:

find . -not -iname "*good*" -a -not -name "." -exec rm {} \; 

我用-exec調用rm那裏,但不知find有一個內置的刪除操作它,見下文

但是小心。注意在上面我必須把-a -not -name "."條款,因爲否則它匹配.,當前目錄。所以我在使用-exec rm {} \;之前先用-print徹底測試!

更新:是的,我從來沒有用過它,但確實有一個-delete行動。所以:

find . -not -iname "*good*" -a -not -name "." -delete 

再一次,要小心,仔細檢查你是不是比你想匹配更匹配的第一。

+1

特別好的建議首先使用'-print'。 :) – sarnold

6

使用bash,您可以通過extglob外殼選項得到"negative" matching

shopt -s extglob 
rm !(*good*) 
相關問題