bash - 如何在 find -exec 中获取文件的基本名称
问题描述
我目前正在尝试提取和使用 find 命令结果的文件名。
find /var/log/*/* -iname "*.log" -type f -exec echo $(basename -- {}) \;
实际输出:
/var/log/xyz/log1.log
/var/log/xyz/log2.log
/var/log/xyz/log3.log
/var/log/xyz/log4.log
预期输出:
log1.log
log2.log
log3.log
log4.log
使用中是否有技巧或误解-exec
?
当我echo $(basename -- 'path/to/file.txt')
在 bash 中执行时,它会正确返回file.txt
更多细节:
我需要在结果中使用完整路径和基本名称:
我的完整命令如下所示:
find /var/log/*/* -iname "*.log" -type f -exec gzip -k -f {} \; -exec gzip -t {}'.gz' \; -exec sh -c "cat {} | grep 'str' > /tmp/$(basename -- {})" \; # and more after
在此命令中,我无法提取文件名并使用它。它总是返回文件的完整路径,如/var/log/foo/bar.log
解决方案
您无需basename
在exec
选项后致电。只需使用-execdir
选项并打印{}
为:
find /var/log/*/ -iname '*.log' -execdir printf '%s\n' {} +
如果您真的必须打电话,basename
那么将其用作:
find /var/log/*/ -iname '*.log' -exec basename -- {} \;
根据您的评论和编辑过的问题,您似乎最好以find
这种方式使用结果:
while IFS= read -rd '' file; do
echo "$file"
basename "$file"
# remaining commands like gzip etc
done < <(find /var/log/*/ -iname '*.log' -print0)
推荐阅读
- abaqus - 如何将草图信息放入 abaqus 的 .inp 文件中?
- amazon-web-services - How to get custom log4j.properties to take effect for Spark driver and executor on AWS EMR cluster?
- node.js - 在 mongodb nodejs 中向博客添加评论
- reactjs - redux-resist 防止在刷新时丢失数据
- java - 在 Raspberry Pi 上通过 snap 安装的 Gradle 无法构建,缺少 cacerts
- java - 如何理解测试课中的“公众”?
- python - 如何找出列表中该系列的最小值和最大值小于 100 的数据?
- tensorflow - MaskRCNN 转成 pb 文件
- python - 无法使用烧瓶邮件python将附件添加到邮件
- python-3.x - 如何找到在 python 中加载应用程序所需的时间?