2013-06-18 15 views

回答

1

您可以使用ls -1(這是一把手,而不是小寫字母L)以每行列出一個文件,然後使用grep -vx <pattern>排除(-v)行恰好(-x)匹配<pattern>,然後將xargs排除到您的命令rm。例如,

ls -1 | grep -vx file1 | xargs rm 

如果您的grep版本不支持-x選項,你可以使用錨:

ls -1 | grep -vx '^file1$' | xargs rm 

要與比rm其他命令使用這個可能不採取任意數量的參數,請記住將-n 1選項添加到xargs,以便逐個處理參數:

ls -1 | grep -vx '^file1$' | xargs -n 1 rm 

我相信你也可以做到這一點使用find-name選項,指定否定一個參數,即實用find本身可以支持這樣的表達式!(file1),但你還是得管結果爲xargs

1

tcsh對glob模式有特殊的^語法(在csh,sh或bash中不支持)。用^加上一個全局模式前綴,否定它,導致匹配不與匹配模式的所有文件名。

引述的tcsh手冊:

一個完整的水珠圖案也可以用'^'否定:

 > echo * 
     bang crash crunch ouch 
     > echo ^cr* 
     bang ouch 

單個文件名不是水珠圖案,所以^前綴不適用於它,但它可以通過例如用方括號圍繞第一個字符變成一個。

所以這個:

rm ^[f]ile1 

應該刪除比file1其他當前目錄下的所有文件。

我強烈建議使用它之前,無論是第一次使用echo命令測試此:

echo ^[f]ile1 

或使用按Ctrl-X*拓展模式的文件列表擊球前輸入

更新:自從我瞭解到bash支持類似的功能但語法不同。在bash中,!(PATTERN)匹配任何而不是匹配的模式。除非啓用extglob外殼選項,否則不會識別此項。與tcsh的^語法不同,該模式可以是單個文件名。這與你所要求的不相關,但如果你決定切換到bash,它可能會很有用。

zsh可能有類似的東西。