2012-03-12 4 views
2

フォルダとサブフォルダを含むそのすべてのコンテンツをコピーします。私はUbuntuでCを使用しています。コピーされたファイルを指し示すシンボリックリンクを持つディレクトリをコピーします(ディレクトリツリー内)

通常のファイルとフォルダをコピーするのはこれまで簡単で簡単ですが、リンクをコピーするための仕様(今のところシンボリック)は、コピーしたファイルにリンクする必要があります。今のところ、私はディレクトリツリー内のリンクだけに興味があります。

(木外のリンクが、私は簡単なはずだと思う - ちょうど新しいリンクへのフルパスをコピープラス、彼らは木やない属しているかどうかを調べる - sarnoldは私に達成するためにrsyncの使用についてのヒントを与えたが、それは難しいですその)

だから私はREADLINKによって返された絶対パスを持っている:

最悪の場合になります
/home/giorgos/Desktop/folder/folder1/a.pdf 

/home/giorgos/Desktop/folder/folder/folder/folder1/a.pdf 

しかし、私はディレクトリツリーへの相対パスを取得する方法を見つけることができません。私はそれを見つけることができれば、私はコピーしたディレクトリの名前に置き換えることができます:私は、CPまたはシステム()関数またはその種の機能を使用することはできません

/home/giorgos/Desktop/March/folder/myfolder/folder/folder1/a.pdf 

、解決策は、低レベルである必要があります。私はCライブラリ+ GNUを使うことができますが、とにかく私は興味を持っています。

+0

tarとuntarし-hを使用して、部分的に助けを持っているでしょうリンク名の代わりにリンクのターゲットを配置します。 – Jayan

+0

私はリンクのターゲットに興味がありません。既にコピーしました。新しいディレクトリツリーに同じ名前のリンクがあり、対応するファイルを指しています(コピーされています)。 –

答えて

0

ディレクトリSRC_DIRDST_DIRにコピーする必要があるとします。どちらも絶対パスです(そうでない場合は、getcwdを使用して変換することは自明です)。

この擬似コードカバー、すべての可能性(それはおそらく「/」区切りでパスをトークン化するためにstrtokの繰り返し使用の多くが含まれます)する必要があります

if (SRC_DIR/SUBDIRS/LINK is a symlink that points to TARGET_LOCATION) 
    { 
    // TARGET_LOCATION may be relative *or* absolute. Make it absolute: 
    if (TARGET_LOCATION does not begin with '/') 
     { 
     prepend SRC_DIR/ to it 
     } 
    if (TARGET_LOCATION contains a subdirectory named '..') 
     { 
     replace occurances of 'SOMEDIRNAME/..' with '' 
     } 
    if (TARGET_LOCATION contains a subdirectory named '.') 
     { 
     replace occurances of '/.' with '' 
     } 
    // now TARGET_LOCATION is an absolute path 

    if (TARGET_LOCATION does not begin with SRC_DIR) 
     { 
     // symlink points outside tree 
     create symlink DST_DIR/SUBDIRS/LINK pointing to TARGET_LOCATION 
     } 
    else 
     { 
     // symlink points inside tree 
     strip SRC_DIR from beginning of TARGET_LOCATION 
     prepend DST_DIR to TARGET_LOCATION 
     create symlink DST_DIR/SUBDIRS/LINK pointing to TARGET_LOCATION 
     } 
    } 
関連する問題