再帰的にコピーしてファイル名を一意に変更する方法

再帰的にコピーしてファイル名を一意に変更する方法

Linuxファイルシステムタイプの1つを使用してフォーマットされた外部ドライブには、多くの写真を含む大きなツリーがあります(どのタイプのものか覚えていません)。私のMacにインストールされていて写真をコピーしようとしていますが、「somePic.jpg」と「somePic.JPG」というファイルがあるようです。コピーしようとすると、OSXは名前が重複していると文句を言って終了します。ファイル名が一意であることを確認しながら、どのようにコピーできますか? OSXはドライブを読み取り専用でマウントするため、最初にソースツリーで重複したエントリの名前を変更することはできません。

私は何時間もcp、gcp、sed、xargsで遊んでいましたが、何も機能しませんでした。

答え1

...あなたの言葉によると質問に対するコメント...

pax -rws'/\.JPG$/.CAP&/' /root/of/copied/tree /dest/path

もし.jpgそして.JPG唯一の質問です。それがうまくいくでしょう。

また、pファイル名の置換に rint 基本要素を追加して、変更されたすべてのファイル名のリストを取得することもできます。

pax -rws'/\.JPG$/.CAP&/p' /root/of/copied/tree /dest/path

私が知っている限り、paxOSXシステムにすでにインストールされている必要があるため、全体的にストレスのないソリューションになります。

しかし、問題がさらに深刻になると、paxサポートに興味がある可能性があります。

-i

対話的にファイル名またはアーカイブメンバーの名前を変更します。パターンオペランドに一致する各アーカイブメンバー、またはファイルオペランドに一致する各ファイルについて、ファイル名、ファイルモード、および変更時刻を入力するように求められpaxます。次に、1行を読みます。この行が空の場合は、ファイルまたはアーカイブメンバーをスキップします。行が単一のピリオドで構成されている場合、ファイルまたはアーカイブメンバーは名前を変更せずに処理されます。それ以外の場合、その名前はその行の内容に置き換えられます。 EOFがある場合は、ゼロ以外の終了状態で即座に終了します。/dev/ttypax/dev/ttypax( CTRL+D)応答の読み取り中に問題が発生したか、/dev/tty読み取りおよび書き込み操作を開くことができませんでした。

答え2

以下は簡単な焼けです。

# for f in $( find yoursourcedirectory -name \*.jpg ) ; do cp ${f} yourtargetdirectory/${f}.CAP1.jpg ; done

それから

# for f in $( find yoursourcedirectory -name \*.JPG ) ; do cp ${f} yourtargetdirectory/${f}.CAP2.jpg ; done

これにより、ソースから *.jpg という名前のすべてのファイルがインポートされ、*.CAP1.jpg にコピーされ、すべての *.JPG ファイルが *.CAP2.jpg にコピーされます。

別の方法はdiffmergeを使用することです。 https://sourcegear.com/diffmerge/

別の方法(ファイルが多い場合は同じ名前で試してください)は、各ファイルにランダムな名前を割り当てることです。

# for f in $( find yoursourcedirectory -iname \*.JPG ) ; do cp ${f} yourtargetdirectory/$(dd if=/dev/random count=20 2>&1 /dev/null |md5).jpg ; done

(-inameスイッチを使用すると、検索時に大文字と小文字が区別されないため、*.JPGと*.jpgの両方が検索されます。)

関連情報