find -exec cpに関する問題

find -exec cpに関する問題

次の例を考えてみましょう。

touch test0
touch timestamp
touch test1
sudo find /var/www/import -iname 'test*' -newer timestamp -exec cp {} new \;

実際にtest1ファイルをコピーしますが、次のメッセージを返します。

cp: `/var/www/import/new/test1' and `new/test1' are the same file

私は何が間違っていましたか?

2番目の質問です。ファイルを単一の「パッケージ」にコピーするためにこのコマンドに「+」を使用できますか?何千ものファイルがあります!

答え1

私は何が間違っていましたか?

それは問題ではありません。findコピーされたファイルが見つかり、new再度コピーしようとすると警告メッセージが表示されます。

ファイルが単一の「パッケージ」にコピーされるように、このコマンドに「+」を使用できますか?何千ものファイルがあります!

はい、しかし、次のようにコマンドを変更する必要があります。

find /var/www/import -iname 'test*' -newer timestamp -exec cp -t new {} +

なぜなら{}、この場合はexecステートメントの最後になければならないからです。

答え2

echo前に1つを追加すると、cpそれが動作することがわかります

cp new/test1 new
cp test1 new

findこれは、現在のディレクトリだけでなく、すべてのサブディレクトリも検索するためです。

代替:

findサブディレクトリを表示しないように指示します。

find /var/www/import -maxdepth 1 \
    -iname 'test*' -newer timestamp -exec cp {} new \;

findサブディレクトリを無視するように指示しますnew

find /var/www/import -type d -name new -prune -o \
    -iname 'test*' -newer timestamp -exec cp {} new \;

次のディレクトリからファイルをコピーします/var/www/import

find /var/www/import \
    -iname 'test*' -newer timestamp -exec cp {} /var/www/import.new \;

ただし、サブディレクトリがあると、最終的に同じ名前のすべてのファイルが失われます。

たとえば、次のような場合

test0
test1
scripts/test1

それからあなたは結局

test0
test1
new/test1
scripts/test1

どちらがtest1コピーされますかnew

これを処理する方法はいくつかありますが、私が考えることができる最も簡単で効率的な方法は次のようなものです。cp --parents

cd /var/www/import
find . -type d -name new -prune -o \
    -type f -iname 'test*' -newer timestamp -exec cp --parents {} new \;

それはあなたに与えます。

test0
test1
new/test1
new/scripts/test1
scripts/test1

Rushはすでに質問の2番目の部分に答えているので、もう一度繰り返しません。

関連情報