このようなことを試してください:
find /home/mine -iname "*.png" -printf "%P\n " | xargs -I % -n1 cp % /home/mine/pngcoppies/copy%
検索を実行したときに何が起こっているかを確認するには、02
と入力します。
-x :コマンドとその引数を実行時に出力します。
-v :読み込まれたシェル入力行を出力します。
これが私が持っているものです:
find . -name "*.xml" -exec echo {} \;
出力を与える:
./log.xml
./svnLog.xml
そして、私が試してみると:
set -xv
find . -name "*.xml" -exec echo {} \;
私は得る:
find . -name "*.xml" -exec echo {} \;
+ find . -name '*.xml' -exec echo '{}' ';'
./log.xml
./svnLog.xml
そして、リテラルの代わりに見つかったファイル名を渡す実行エコーを見つけます: 15
しかし、 21
に何かを追加すると 以下のように:
find . -name "*.xml" -exec echo something{} \;
+ find . -name '*.xml' -exec echo 'something{}' ';'
something{}
something{}
ここで、私が持っている 2 つの xml ファイルに対してエコーが 2 回実行されます。 exec のパラメータ リストであり、置き換えられることはありません。 42
を取得しました 見つかった各ファイルに対して。
これに対処するには、次のようにファイル名をパラメーターとして渡して echo を実行することを考えることができます:
sh -xvc 'echo sothing/$0' filename
53
が何であるかはすでにわかっています そして 68
. 76
その後の文字列からコマンドを取得することです(85
)
結果は :
sh -xvc 'echo somthing/$0' filename
+ sh -xvc 'echo somthing/$0' filename
echo somthing/$0
+ echo somthing/filename
sothing/filename
'94
を使用しました $0 が現在のシェルによって展開されないようにします。 " " で試してみると、$0 の拡張が表示されます;)
したがって、「問題」に戻るには、検索結果を次のようにフォーマットする必要があります:
find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;
そして、次のようになります:
find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;
+ find . -name '*.xml' -exec sh -xvc 'echo sothing/$0' '{}' ';'
echo sothing/$0
+ echo sothing/./log.xml
sothing/./log.xml
echo sothing/$0
+ echo sothing/./svnLog.xml
sothing/./svnLog.xml
ご覧のとおり、find はシェルのコマンド 107
を実行します。 それに 117
を渡します (find で見つかったファイル名に置き換えられます) したがって、目的の 121
が得られます
135
詳細モードを削除すると、次のようになります:
find . -name "*.xml" -exec sh -c 'echo "cp $0 someWhereElse/$0"' {} \;
cp ./log.xml someWhereElse/./log.xml
cp ./svnLog.xml someWhereElse/./svnLog.xml
したがって、あなたの場合、サブシェルでコピーを実行するだけです( 140
を追加します または 151
または、exec の後に shell を使用する) と let 161
ファイル名をパラメーターとして it に渡します;)
find /home/mine -iname "*.png" -exec sh -c 'cp $0 /home/mine/pngcoppies/copy/$0' {} \;
これが役に立てば幸いです。私の英語について失礼します。
man find から:「-execdir プライマリは、ユーティリティが現在のファイルを保持するディレクトリから実行されることを除いて、-exec プライマリと同じです。文字列 ``{}'' に置き換えられたファイル名は修飾されていません。」
find /home/mine -iname "*.png" -execdir cp {} /home/mine/pngcoppies/copy{} \;