当该文件没有对应的文件时,如何找到并执行该程序?
示例文件:
/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
选项可以位于搜索条件之后。