![Bash:命令 basename 的功能/使用不当](https://linux22.com/image/768000/Bash%EF%BC%9A%E5%91%BD%E4%BB%A4%20basename%20%E7%9A%84%E5%8A%9F%E8%83%BD%2F%E4%BD%BF%E7%94%A8%E4%B8%8D%E5%BD%93.png)
我在以下命令中想要查找特定文件并将它们移动到其他目录,同时将“.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"' -- {} \;
但要对这样的解决方案进行适当的测试,以确保引用和转义能够正确工作。