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

今天我正在寻找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 -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' {} \;

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

相关文章

1、安装Apache。 1)执行如下命令,安装Apache服务及其扩展包...
一、先说一下用ansible批量采集机器信息的实现办法: 1、先把...
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | ...
如何抑制stable_secret读取关键的“net.ipv6.conf.all.stabl...
1 删除0字节文件 find -type f -size 0 -exec rm -rf {} ...
## 步骤 1:安装必要的软件包 首先,需要确保系统已安装 `dh...