Bash:命令 basename 的功能/使用不当

Bash:命令 basename 的功能/使用不当

我在以下命令中想要查找特定文件并将它们移动到其他目录,同时将“.log”附加到目标文件名。

find /src/dir/ -type f -mtime +3 -exec mv {} /dst/dir/`basename {}`.log \;

但它失败了,因为basename反引号中的命令不能正常运行。$(basename {})也有类似的结果。

mv: cannot move /src/dir/foo to /dst/dir//src/dir/foo.log: No such file or directory

任何想法都将受到赞赏。

答案1

这是因为 shell在处理 find 和处理参数之前看到了`basename {}`or 。编写一个执行所需操作的脚本,然后改为使用 or 运行它。$(basename {})-exec

find ... -exec myscript {} \;

myscript类似的东西在哪里

#! /bin/sh
mv "$1" /dst/dir/$(basename "$1").log

您可以为找到的每个文件调用 shell,因此以下操作也是可能的:

find ... -exec bash -c 'mv "$1" "$(basename "$1").log"' -- {} \;

但要对这样的解决方案进行适当的测试,以确保引用和转义能够正确工作。

相关内容