linux – 在find -exec中使用basename和full path

linux – 在find -exec中使用basename和full path,第1张

概述今天我正在寻找bash脚本世界的冒险经历. 假设我要将/ home / mine / Pictures的任何子目录中的任何png文件复制到/ home / mine / pngcoppies,并使用find和-exec将其重命名为“copy [basename]”.这将要求我在同一个exec命令中使用完整路径名和基名.我的问题是我不知道如何获得基名. (见下文) find /home/mine - 今天我正在寻找bash脚本世界的冒险经历.

假设我要将/ home / mine / Pictures的任何子目录中的任何png文件复制到/ home / mine / pngcoppIEs,并使用find和-exec将其重命名为“copy [basename]”.这将要求我在同一个exec命令中使用完整路径名和基名.我的问题是我不知道如何获得基名. (见下文)

find /home/mine -iname "*.png" -exec cp {} /home/mine/pngcoppIEs/copy{what_do_I_enter_here?} \;

注意:以上实际上并不是我正在做的事情,但它是问题的一个基本示例,因此使用其他方法实现相同目的的解决方法在这里并不适用.问题基本上是关于find -exec及其对basenames的使用.

提前致谢!

解决方法 要查看执行查找时发生的情况,只需键入set -xv即可
-x:在执行时打印命令及其参数.
-v:在读取时打印shell输入行.

这是我有的:

find . -name "*.xml" -exec echo {} \;

给出输出:

./log.xml./svnLog.xml

当我尝试:

set -xvfind . -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/
sh -xvc 'echo somthing/
find . -name "*.xml" -exec sh -xvc 'echo sothing/
find . -name "*.xml" -exec sh -xvc 'echo sothing/
find . -name "*.xml" -exec sh -c 'echo "cp 
find /home/mine -iname "*.png" -exec sh -c 'cp  /home/mine/pngcoppIEs/copy/' {} \;
someWhereElse/"' {} \;cp ./log.xml someWhereElse/./log.xmlcp ./svnLog.xml someWhereElse/./svnLog.xml
' {} \;+ find . -name '*.xml' -exec sh -xvc 'echo sothing/' '{}' ';'echo sothing/+ echo sothing/./log.xmlsothing/./log.xmlecho sothing/+ echo sothing/./svnLog.xmlsothing/./svnLog.xml
' {} \;
' filename+ sh -xvc 'echo somthing/' filenameecho somthing/+ echo somthing/filenamesothing/filename
' filename

我们已经知道什么是-x和-v. -c是从它后面的字符串中获取命令(man sh)

结果是:

我在”之间使用’echo somthing / $0′,以便$0不会被当前的shell扩展.尝试用“”,你会看到$0的扩展;)

因此,要回到“问题”,查找应格式如下:

我们会得到:

我们可以看到,find会执行shell cammand echo sothing / $0传递给它'{}'(由find找到的文件名替换)所以我们得到了所需的echo sothing /./ log.xml

设置xv以删除详细模式
我们可以得到:

所以在你的情况下,你只需要在子shell中执行副本(添加sh或bash或者在exec之后你喜欢shell)并让find将文件名作为parapeter传递给它;)

希望这可以帮助我,并为我的英语执行.

总结

以上是内存溢出为你收集整理的linux – 在find -exec中使用basename和full path全部内容,希望文章能够帮你解决linux – 在find -exec中使用basename和full path所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1046070.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存