要查看执行查找时发生的情况,只需键入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
然后找到执行回显传递找到的文件名而不是litteral:'{}’
但是当您向{}添加内容时,如下所示:
find . -name "*.xml" -exec echo something{} \;
+ find . -name '*.xml' -exec echo 'something{}' ';'
something{}
something{}
这里对我所拥有的2个xml文件执行两次echo,并且因为没有更多'{}’是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
设置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中执行副本(添加sh或bash或者在exec之后你喜欢shell)并让find将文件名作为parapeter传递给它;)
find /home/mine -iname "*.png" -exec sh -c 'cp $0 /home/mine/pngcoppies/copy/$0' {} \;
希望这可以帮助我,并为我的英语执行.