2012-11-23 16 views
4

我想使用OSX「xattr」實用程序將擴展屬性從一個文件複製到另一個文件。背景是我們正在構建一個備份工具,文件/結構必須保留所有屬性,ACL等......除了像資源分支這樣的大屬性外,一切工作都正常。使用下面的方法,小屬性可以正常工試圖在OS X 10.7.5上這是我在做什麼:複製Mac com.apple.ResourceFork擴展屬性導致「參數列表太長」

首先我使用「ls -l @」標識文件上的屬性。結果如下:

[email protected] 1 testuser staff  0 3 Jan 2011 File 
     com.apple.FinderInfo   32 
     com.apple.ResourceFork 237246 

現在我出口的屬性(com.apple.ResourceFork是一個導致問題):

xattr -px com.apple.ResourceFork File > attribfile 

我現在想這個屬性應用於該文件的另一個副本MAC使用該命令:

xattr -wx com.apple.ResourceFork "`cat attribfile`" File 

這導致:

-bash: /usr/bin/xattr: Argument list too long 

我想我知道它爲什麼會發生......資源分叉數據太長以至於無法適應參數。我還沒有確定它開始打破的門檻,但我懷疑它與ARG_MAX有關。 xargs在這裏沒有幫助,因爲它不是幾個較小的參數,而是一個非常大的參數。

那麼多的問題:

  1. 有沒有一種方法,使XATTR接受這個大的價值嗎?以某種方式通過標準輸入管道它?手冊頁不顯示它,但我不是專家,也許有一些創造性的方式來做到這一點
  2. 任何人都可以告訴我正確的方法來使用股票命令行工具應用一個大的擴展屬性?
  3. 如果沒有股票命令行工具,對第三方工具有任何建議?
+0

這可能會有一點牽扯,但是可能不可能對'xattr'進行反向工程並編寫自己的接受屬性文件作爲其輸入的簡單替換。如果你幸運的話,用一種方便的腳本語言就可以進行一次系統調用,並帶有一個綁定 - Perl單線程? – tripleee

+0

我們正在尋找這個選項。看起來這個工具是MIT的許可證,所以它的商業友好。 – Chris

回答

3

我不知道如何使用xattr來做到這一點,但您可以使用舊的文件系統技巧。注意:這基本已經過時,但仍然在10.8.2;我做任何承諾約10.8.3等。如果attribfile是十六進制格式,使用:

xxd -r -p attribfile >File/..namedfork/rsrc 

如果attribfile爲原料,使用cat代替xxd -r -p。如果這個屬性是資源分支以外的東西,...我不知道。

+0

嗯,我試圖導出的資源叉,這是失敗的10.7 +。從未嘗試過以這種方式設置它。我會試一試。 – Chris

+0

好吧,這似乎工作,它解決了資源分叉的問題!謝謝! – Chris

+0

您也可以不使用中間臨時文件: 'xattr -p -x com.apple.ResourceFork src | xxd -p -r - > dst/.. namedfork/rsrc' – dardo82

1

接受的答案並不適用於我,因此我繼續尋找另一種解決方案,在其他人需要的情況下發布此處。

我的問題是將vlc-2.1.4複製到/ Applications文件夾。它不停地說:

The Finder can’t complete the operation because some data in 「VLC」 can’t be read or written. 
(Error code -36) 

,如果我試圖在我漸漸在這個線程指示錯誤的終端使用cp

所以我所做的就是在控制檯中執行以下命令(總結I tar VLC並將其解壓到目標中,所以...它可以作爲一個cp):

cd /Volumes/vlc-2.1.4/ 
tar cf /Applications/vlc.tar VLC.app 
cd /Applications/ 
tar xf vlc.tar 
rm vlc.tar 

我希望這將是有益的其他有同樣的問題。