要查看执行查找时发生了什么,只需键入set -xv
-x : 在执行时打印命令及其参数。
-v : 在读取 shell 输入行时打印它们。
这是我所拥有的:
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
然后 find 执行 echo 传递找到的文件名而不是 litteral :'{}'
但是当您向{} 添加一些内容时,如下所示:
find . -name "*.xml" -exec echo something{} \;
+ find . -name '*.xml' -exec echo 'something{}' ';'
something{}
something{}
这里对我拥有的 2 个 xml 文件执行了两次回显,并且由于没有更多的 '{}' 是 exec 的参数列表,因此不会被替换。所以我们得到了每个找到的文件的echo 'something{}'。
为了解决这个问题,您可以考虑执行 echo 将文件名作为参数传递给它,例如:
sh -xvc 'echo sothing/$0' filename
我们已经知道-x 和-v 是什么。 -c是从后面的字符串中获取命令(man sh)
所以结果是:
sh -xvc 'echo somthing/$0' filename
+ sh -xvc 'echo somthing/$0' filename
echo somthing/$0
+ echo somthing/filename
sothing/filename
我在 ' ' 之间使用了 'echo somthing/$0',这样 $0 就不会被当前的 shell 扩展。用 " " 试试,你会看到 $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 将执行 shell cammand echo sothing/$0 传递给它 '{}'(替换为 find 找到的文件名)所以我们得到所需的 echo sothing/./log.xml
set +xv 删除详细模式
我们可以得到:
find . -name "*.xml" -exec sh -c 'echo "cp $0 someWhereElse/$0"' {} \;
cp ./log.xml someWhereElse/./log.xml
cp ./svnLog.xml someWhereElse/./svnLog.xml
所以在您的情况下,您只需在子 shell 中执行副本(在 exec 之后添加 sh 或 bash 或您最喜欢的 shell)并让 find 将文件名作为 parapeter 传递给它; )
find /home/mine -iname "*.png" -exec sh -c 'cp $0 /home/mine/pngcoppies/copy/$0' {} \;
希望这能有所帮助,请执行我的英语。