次の例を考えてみましょう。
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番目の部分に答えているので、もう一度繰り返しません。