2013-02-21 55 views
1

我有一個非常微妙的bash的問題:如何限制模式匹配,以第一個匹配的文件

一個目錄內富

$ ls 
foo.tgz bar.tgz baz.tgz 

我要生成一個bash單排,提取第一個壓縮檔類似的模式:

bash -c "tar -zxvf foo.tgz file1" # fine 
bash -c 'tar -zxvf *.tgz file1" # oups trying to extract bar.tgz from foo.tgz! 

是否有可能將模式匹配限制爲第一個擴展參數?

細化:

find -iname '*.tgz' | xargs tar -zxvf # oups! cannot add restriction to only extract file1 

回答

2

使用-quit主要與find

find -iname '*.tgz' -exec tar -zxvf '{}' \; -quit 

由於動作是從左到右進行處理的,因此將在第一次匹配時運行tar,然後結束find命令。

+0

我比其他人更喜歡這個解決方案,因爲它正確覆蓋沒有找到文件的情況。不幸的是,這兩種解決方案都不會讓它進入代碼,因爲它更容易在代碼中找到文件。 – Alex 2013-02-21 15:39:26

2

當然,試試這個:

tar -zxvf $(ls *.tgz | head -1) file1 

你應該考慮如果沒有匹配的模式會發生什麼....

+0

你確定這是個問題嗎?在這種情況下,bash -c會返回大於2的東西 '$ bash -c「tar -zxvf /tmp/bar.tar.bz2 file1」' '$ echo $?' '2' – Alex 2013-02-21 13:23:10