linux basename用法,关于linux:在find -exec中使用basename和full path

我正在用find today进行bash脚本编写世界的冒险。

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

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

注意:上面并不是我正在做的,但它是这个问题的一个基本例子,因此使用其他方法来实现相同目的的解决方法在这里并不真正适用。这个问题从根本上讲是关于find-exec及其对basename的使用。

事先谢谢!

要查看执行查找时发生了什么,只需键入set -xv。-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

然后查找execute echo,传递找到的文件名而不是一般文件名:'{}'。

但是当你在{}中添加一些东西时,如下所示:

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

+ find . -name '*.xml' -exec echo 'something{}' ';'

something{}

something{}

在这里,echo对我拥有的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

我在""之间使用了"EDOCX1"(9),这样,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

如我们所知,这个查找将执行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将文件名作为副参数传递给它;

find /home/mine -iname"*.png" -exec sh -c 'cp $0 /home/mine/pngcoppies/copy/$0' {} \;

希望这能有所帮助,并原谅我的英语。

从人身上发现:"-execdir primary与-exec primary相同,但实用程序将从保存当前文件的目录执行。用字符串"`"""替换的文件名不合格。"

find /home/mine -iname"*.png" -execdir cp {} /home/mine/pngcoppies/copy{} \;

这是给我的。

尝试如下操作:

find  /home/mine -iname"*.png" -printf"%P

" | xargs  -I % -n1 cp %  /home/mine/pngcoppies/copy%

要获取您使用的basename

basename $your_full_path

在basename之前获取该路径

dirname $your_full_path

很抱歉要求调料,但我如何将此应用于查找实例?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值