ファイルがまだそこに存在しない場合にのみ、ディレクトリ構造内のすべてのファイルを特定のパスにコピーします


8

ファイルが存在しない場合にのみ、ディレクトリ構造から特定のディレクトリにすべてのファイルをコピーします。

このスタックオーバーフローの質問の最初の部分を手に入れました:

find . -type f -exec cp {} /target-directory \;

ファイルが存在するかどうかを確認するにはどうすればよいですか?そうでない場合はファイルをコピーし、そうでない場合はスキップします。


「ソースツリーのすべてのファイルをサブディレクトリのない(特定の)単一のディレクトリにコピーする」という意味ですか?または「ソースツリー内のすべてのファイルを、ソースツリー内の場所と同様に、宛先ディレクトリのサブディレクトリにコピーします」?最初のケースとして質問を読みました-明確にするために質問を編集できますか?(私はあなたがあなたの答えを持っていることを知っていますが、それは他の人たちによって読まれ、使用されます。)
Volker Siegel

回答:


13

コマンド-uからスイッチを使用できますcp

SOURCEファイルが宛先ファイルよりも新しい場合、または宛先ファイルが欠落している場合にのみコピーする

またはrsync次のコマンドを使用し--ignore-existingます:

受信機に存在するファイルの更新をスキップする

例:

rsync --ignore-existing source/* destination/

3

元のコマンドは次のように書き直すことができます。

find . -type f -exec bash -c 'test -e /target-directory/"$1" || cp "$1" /target-directory' sh {} \;

ここで重要なのは、特定のコマンドでシェルを呼び出し、見つかったファイルを$1引数として渡すことです。test -e /target-directory/"$1"失敗した場合は、ファイルが存在しないことを意味cpします。この場合、ファイルがコピーされます。

一般に、コマンドがファイルの存在を確認できる限り、他のコマンドを使用できます。他の選択肢のいくつか:

  • /usr/bin/realpath -e /target-directory/"$1" > /dev/null || cp "$1" /target-directory
  • stat >/dev/null /target-directory/"$1" || cp "$1" /target-directory/"$1"

2
statBashでファイルの存在をテストする理由 test -eそれほど単純ではないでしょうか?
David Foerster 2017年

@DavidFoerster特に理由はありません。テストコマンドも実行します。忘れないように後で回答を編集します
Sergiy Kolodyazhnyy

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.