web-dev-qa-db-ja.com

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

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

このStack Overflowの質問 から最初の部分を取得しました:

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

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

8
mr au

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

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

または、--ignore-existingrsyncコマンドを使用します。

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

例:

rsync --ignore-existing source/* destination/
13
Ravexina

元のコマンドは次のように書き換えられます。

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"
3

man cpを読み取り、cp--no-clobberオプションを使用します。

0
waltinator