对所有没有相应扩展名的文件执行

对所有没有相应扩展名的文件执行

当该文件没有对应的文件时,如何找到并执行该程序?

示例文件:

/file1.c
/file1.h

/file2.c

/file3.c
/file3.hpp

/file4.c/unrelated.txt

find / -type f -name '*.c' -exec my_program_here {} \;执行于:

/file1.c
/file2.c
/file3.c

但我想过滤掉那些有相应.h文件的。最后,my_program_here应该运行在:

/file2.c
/file3.c

就我而言,如何过滤掉*.h存在的所有结果?

答案1

尝试执行sh包装器my_program_here而不是直接运行它。例如:

find . -type f -name '*.c' -exec \
  sh -c '[ ! -e "${1%c}h" ] && my_program_here "$1"' find-sh {} \;

或者(仅 fork sh 一次并迭代所有匹配的 .c 文件):

find . -type f -name '*.c' -exec sh -c \
  'for f; do
     [ ! -e "${f%c}h" ] && my_program_here "$f"
   done' find-sh {} +

这些使用 shell 的参数扩展%“删除匹配后缀”功能来检查当前正在处理的 .c 文件是否存在匹配的 .h 文件。如果不存在,它将执行 my_program_here,并将文件名作为参数。

https://pubs.opengroup.org/onlinepubs/007908775/xcu/chap2.html

${parameter%word}

删除最小后缀模式。该词将被扩展以产生一种模式。然后参数扩展将产生参数,其中后缀的最小部分与删除的模式匹配。

此功能在 bash、ksh 和其他与 posix 兼容的类 bourne shell 中可用。

答案2

免责声明:我是该书的当前作者生皮(右旋)这里使用的程序(参见https://github.com/raforg/rawhide)。

更短(但同样棘手)右旋选择:

rh -X 'my_program_here %S' 'f && "*.c" && !"n=%S; [ -f \"${n%%c}h\" ]".sh'

就像-X 'my_program_here %S'GNU寻找安全地chdirs--execdir到包含每个匹配文件的目录并%S引用每个文件的基本名称(例如寻找{})。

你可以使用-x 'my_program_here %s'类似于寻找不安全地--exec引用匹配文件的完整路径(%s例如寻找{})。

搜索条件使用 shell 转义 ( f) 来搜索名为 *.c ( ) 的文件"*.c"( ),其中相应的 *.h 文件不存在!"n=%S; [ -f \"${n%%c}h\" ]".sh。请注意,double %( %%) 不使用 shell 参数扩展${var%%suffix}。它只是%shell 转义字符串中的一个带引号的单引号。

在 Linux 上,该-X选项可以位于搜索条件之后。

相关内容