首页 > 解决方案 > 如何在 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

标签: bashshellunix

解决方案


您无需basenameexec选项后致电。只需使用-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)

推荐阅读