3

Python 2.7.3 を使用しています。ディレクトリツリーの一部をある場所から別の場所にコピーするPythonスクリプトに取り組んでいます。コピーする必要があるファイルの一部はシンボリック リンクです。

Python を使用して、ある場所から別の場所にシンボリックリンクをたどらずにコピーするにはどうすればよいですか? (「通常の」ファイルと同じように盲目的にコピーしたいだけです)

shutil.copy()Python 3.3 では引数 がサポートされていますfollow_symlinks=Falseが、古いバージョンの shutil ではサポートされていません。

編集: 詳細:

このスクリプトの目的は、指定された場所からすべてのファイルを取得し、それらを個々のアーカイブに分割することです。ディレクトリ全体を圧縮してアーカイブを分割することでこれを実行できることはわかっていますが、1 つの大きなアーカイブに再結合することなく、各アーカイブを個別に抽出する機能が必要です。また、各アーカイブは指定されたサイズ未満である必要があります。

基本的なアプローチ:

  1. ソース ディレクトリのすべてのファイルへのすべての絶対パスを取得する
  2. すべてのファイルのすべてのサイズを取得する
  3. すべてのファイルを (場所に関係なく) サイズ順に並べ替える
  4. 場所 X から tmp の場所にファイルをコピーします (コピーされたファイルの合計が最大アーカイブ サイズ以下になるまで)
  5. tmp のアーカイブを作成
  6. クリーンな tmp の場所
  7. コピーするファイルがまだあるうちに 4 に戻る

フィードバックをいただければ幸いです。ありがとう。

4

1 に答える 1

3

ディレクトリ ツリーの一部をコピーするということですか。その場合は、 を試してくださいshutil.copytree()

symlinks が true の場合、ソース ツリーのシンボリック リンクは新しいツリーのシンボリック リンクとして表されますが、元のリンクのメタデータはコピーされません。false または省略した場合、リンクされたファイルのコンテンツとメタデータが新しいツリーにコピーされます。

したがって、メタデータを同じに保つ必要がない限り、これは問題なく機能するはずです (実際、シンボリックリンク自体にそのようなメタデータを含めることもできますか、それとも、それらが指すファイル/オブジェクトのメタデータを参照するだけですか? )。copytree()また、ツリー全体を;でコピーする必要はないことに注意してください。このignore引数を使用すると、コピーするファイルとディレクトリを削除する callable を指定できます。

ただし、注意すべき点が 1 つあります。callable に渡されたコンテンツ リストを変更すると、ignoreコピーされる内容にも影響します (ソース コードcopytree()確認できます)。


(コメントからのコピー/言い換え)

の実装は、シンボリック リンクの処理shutil.copytree()方法を示しているためcopytree()( )、シンボリック リンク自体が役に立たないlinkto = os.readlink(srcname); os.symlink(linkto, dstname)場合でも、シンボリック リンクを「コピー」する方法の参考として使用できます。copytree()

于 2012-07-23T15:54:16.640 に答える