2013-10-30 45 views
2

我將tar命令傳遞給應用程序中的shell執行程序。但似乎我的tar語法不正確。 (這是windows(bsdtar命令),但工作原理與Linux相同,據我所知,我也可以在Linux上測試,如果需要的話)。使用-C選項和通配符的tar文件

我試圖tar所有以ext結尾的文件將完整路徑存儲在我的tar文件中。

tar -cvzf test.tar.gz -C C:/mydir/toTar/ *.ext 

我得到連接錯誤:

tar: *.ext: Cannot stat: No such file or directory 

我可以給整個路徑,但隨後我的焦油包含C-> mydir-> toTar->。我只想要這些文件,而不是mydir和toTar。

到目前爲止,只有接近我想要的東西是「。」而不是「* .ext」,但那也是其他的東西,我顯然不想要。

任何接受者?

+0

我能cd對目錄,然後執行我的焦油,但在我的情況,因爲我將命令傳遞給別的事情執行,我不能那樣做。一次只能執行一個命令。 – dlite922

+1

除非給出特定選項才能這樣做,否則tar不會執行通配符擴展;外殼的確如此。它看起來像bsdtar需要一個選項'--include ='*。ext'',所以請嘗試使用而不是* .ext參數。您可能需要這些單引號來防止shell在應用程序調用tar命令的任何目錄中擴展* .ext。 –

+0

嗯,我忘了include。 Rsync也有這個選項,並已成功使用它。也許我會試試這個。它是否仍然需要一個參數? (文件列表參數爲焦油?) – dlite922

回答

2

問題是*是shell擴展的通配符,但是您正在繞過shell並直接調用tartar命令正在查找一個文件名爲*.ext的文件,該文件不存在。

的選項有:

  1. 展開的文件列表在自己的代碼,並通過該列表tar
  2. 通過調用類似/bin/sh -c tar ...

對於選項2可能會有安全隱患調用你的代碼中殼 - 如果外殼看到一些它認爲是一個命令,它會運行它。因此,選項1更安全,但取決於您,這更有意義。

+0

是的,這正是問題所在。外殼擴展它。我希望有一種方法可以讓tar擴展它(就像用雙引號或someting包裝它)。 由於這些選項是內部生成的,並且不受用戶輸入的影響,我認爲他們從第三方意義上來說是安全的。我將選擇1,因爲它更乾淨,但它會添加幾個for循環來獲取來自不同位置的所有文件名。好吧。 感謝您的幫助。 – dlite922

0

我對你如何在明顯類似於linux的環境中使用dos風格的路徑感到困惑。但這就是我該怎麼做的。如果細節可能不正確,希望這個概念是清楚的。

cd C:/mydir/toTar/ 
mkdir ~/tmpwork 
find . -name '*.ext' > ~/tmpwork/extfiles 
tar czvfT ~/tmpwork/test.tar.gz ~/tmpwork/extfiles 
rm ~/tmpfiles/extfiles 
+1

也許這是一個Cygwin上下文。 –

-1

周圍有shell擴展沒有辦法不使用管道等

+0

你能舉個例子嗎? –