web-dev-qa-db-ja.com

ファイルを見つけてコピーする

次のファイルがコピー先フォルダーにコピーされないのはなぜですか?

# find /home/shantanu/processed/ -name '*2011*.xml' -exec cp /home/shantanu/tosend {} \;

cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'
111
shantanuo

見つかったファイルを/ home/shantanu/tosendにコピーすることが目的の場合、cpへの引数の順序が逆になります。

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp {} /home/shantanu/tosend  \;

注:findコマンドは、一致するファイルのプレースホルダーとして{}を使用します

245
malcolmpdx

このような問題に直面しました...

実際には、2つの方法でfindコマンド出力をcopyコマンドで処理できます

  1. findコマンドの出力にスペースが含まれていない場合、つまりファイル名にスペースが含まれていない場合、以下のコマンドを使用できます:

    構文:find <Path> <Conditions> | xargs cp -t <copy file path>

    例:find -mtime -1 -type f | xargs cp -t inner/

  2. しかし、ほとんどの場合、実稼働データファイルにはスペースが含まれている場合があります。以下のコマンドのほとんどはより安全です:

    構文:find <path> <condition> -exec cp '{}' <copy path> \;

    find -mtime -1 -type f -exec cp '{}' inner/ \;

2番目の例では、最後の部分、つまりセミコロンもfindコマンドの一部と見なされ、Enterボタンを押す前にエスケープする必要があります。そうしないと、次のようなエラーが表示されます

find: missing argument to `-exec'

あなたの場合、コピーコマンドの構文が間違っていますは、検索ファイルを/home/shantanu/tosendにコピーします。次のコマンドが機能します。

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp  {} /home/shantanu/tosend \;
27
Thiyagu ATR

引数がソースではなくターゲットディレクトリであることを伝えるには、cp -t /home/shantanu/tosendを使用する必要があります。その後、cpを取得してできるだけ多くのファイルを一度にコピーするために、-exec ... +に変更できます。