2010-08-03 38 views
2

我試圖找到最近與此bash:從查找過濾出目錄和擴展?

find . -mtime 0 

這給了我

en/content/file.xml 
es/file.php 
en/file.php.swp 
css/main.css 
js/main.js 

但我想篩選出enes目錄,但要搶別的修改的文件。另外,我想從這些結果中篩選出.swp文件。

所以我想回去:

css/main.css 
js/main.js 
xml/foo.xml 

除了內es/en不是每個其他文件,並在.swp

回答

10

正常,只是在尋找:

find -mtime 0 -not \(-name '*.swp' -o -path './es*' -o -path './en*' \) 
+0

很好的答案!find很不錯,但是在各種UNIX版本中的實現有所不同,所以我更喜歡易於記憶和使用更多標準選項的命令的解決方案 – mmonem 2010-08-03 19:50:06

+0

我可以同意這一點,但是看看OP的標籤和代表我認爲'grep'是已知的而不是一個選項。將它保留在'find'中允許更靈活的輸出/動作('-exec','-ls','-print0','-printf',...) – mvds 2010-08-03 19:57:46

+0

(順便提一句,標籤'bash'意味着GNU) – mvds 2010-08-03 19:58:51

2
find . -mtime 0 | grep -v '^en' | grep -v '^es' | grep -v .swp 

grep的-v標誌使得它返回的所有行未結束即不要匹配模式。

+0

這可能無法正常工作:'find .'的輸出將返回以'。/'開頭的行,因此'grep -v「^ e ...」將不匹配,因此將不過濾不需要的行。 – 2010-08-03 19:43:22

2

試試這個:

find . -mtime 0 | grep -v '^en' | grep -v '^es' 

在給grep的格局開始添加字符確保這是一個必須找到在該行的開頭模式。

更新:Chen Levy's評論(縣),請使用以下代替上面

find . -mtime 0 | grep -v '^\./en' | grep -v '^\./es' 

發現是偉大的,但在不同的UNIX版本的實現不同,所以我更喜歡那些更容易記憶的解決方案並且使用命令與更多的標準選項

+0

固定模式確實使它更強壯一些。我更新了我的答案以匹配。 – speshak 2010-08-03 19:31:33

+0

請參閱我對@ speshak的回答的評論。也可以在沒有grep的幫助下找到這個工作。 – 2010-08-03 19:52:19

+0

@陳,絕對正確!我更新了我的答案。 – mmonem 2010-08-03 20:00:01

3

-prune命令防止找到形式降下來要避免的目錄:

find . \(-name en -o -name es \) -prune , -mtime 0 ! -name "*.swp" 
0

發現的-regex選項(1)(其可以與-E選項,以使擴展正則表達式進行組合)相匹配的整個文件路徑也是如此。

find . -mtime 0 -not \(-name '*.swp' -o -regex '\./es.*' -o -regex '\./en.*' \) 
find "$(pwd -P)" -mtime 0 -not \(-name '*.swp' -o -regex '.*/es.*' -o -regex '.*/en.*' \)