2011-04-21 58 views
15

以下是從我試圖 tar腳本中的所有php文件在一個subdir中的腳本片段。它試圖用「--include」參數 但似乎並沒有工作(輸出是在bash「設置-x」)焦油與 - 包括模式

+ find . -name '*.php' 
./autoload.php 
./ext/thrift_protocol/run-tests.php 
./protocol/TBinaryProtocol.php 
... 
./transport/TTransportFactory.php 
+ tar -cvjf my.tar.bz2 '--include=*.php' . 
+ set +x 

find發現了幾個PHP文件,但焦油似乎沒有看到他們。如果我拿出--include所有文件都是tarred。

我知道我可以使用找到養活列表 (find . -name '*.php' -print0 | tar -cvjf "my.tar.bz2" --null -T -),但什麼毛病--include PARAM?

+0

屬於上unix.stackexchange.com – 2011-04-21 17:53:52

+0

嗯如果是的話 - 應該真的是在一個SO'tar'標籤? – nhed 2011-04-21 17:57:59

+4

@nhed'GNU tar'和'BSD tar'都不識別'--include'。你使用的是什麼版本的「tar」? – cnicutar 2011-04-21 18:01:44

回答

6

其實我只是看着我的freebsd系統上的tar(1),我發現了一個--include選項(早些時候我在網上看過一些老版本的頁面)。 --include選項非常強大。下面是一些例子

這些文件

[email protected] ~/tar_test $ ls -1 
a.c 
b.c 
x 

簡單焦油,封存所有

[email protected] ~/tar_test $ tar -cvf archive1.tar * 
a a.c 
a b.c 
a x 

僅存檔C文件

[email protected] ~/tar_test $ tar -cvf archive2.tar --include='*.c' * 
a a.c 
a b.c 

因此,腳本中可能出現的錯誤是您輸入焦油.而不是.*作爲最後一個參數。

編輯

我已經嘗試過了,很吃驚。 tar(1)的行爲是意想不到的,但(我相信)意圖。該手冊頁說:

Process only files or directories that match the specified pattern. 

因此,當您指定模式時,它會過濾掉任何不匹配的目錄。所以如果你的目錄沒有碰到這個擴展名(它是有效的但不常見)它不會下降到(即使內部深處可能有「有趣的」文件)。

所以最後我相信最好用另一種方式遞歸枚舉+過濾器文件。

+0

你嘗試任何遞歸?不像'zip','tar'默認是遞歸的。這似乎打破了這裏。我更喜歡**它不便攜式,不要使用它**的方法。我的意思是,爲什麼要用'tar -cvf x.tar * .c'完成同樣的事情呢? – nhed 2011-04-21 19:58:30

+1

這是命令不能滿足所有稱皮重'* .c'文件?:的'tar -cvf archive2.tar * .c' – yeliabsalohcin 2017-09-12 10:00:02

+0

--include選項的GNU tar不存在作爲V1.30的! – Enzo 2018-03-08 14:37:08

46

GNU 焦油有一個-T or --files-from option可以採取包含模式列表的文件包括。使用此選項指定的文件對於stdin可以是「 - 」。因此,你可以傳遞一個tar文件的任意列表,從標準輸入使用-files-from-。你舉的例子就變成:

find . -name '*.php' | tar -cvjf my.tar.bz2 --files-from - 
+1

接受的答案不適用於我,但這太棒了! – vsnyc 2015-12-15 21:35:46

+1

另外,如果你想擁有匹配多個模式進入tar文件事情,你可以做這樣的事情: 發現。 -regex「。* \。php」-o -regex「。* \。css」|焦油cvzf stuff.tgz --files - 從 - – 2016-02-10 03:35:52

+0

這不包括空direcories,不是嗎? – 2017-05-12 17:17:13