在<
运行命令之前,操作符被 shell 解释为重定向。shell 尝试将输入从名为 's stdin 的文件重定向{}
,find
如果该文件不存在,则会发生错误。
to 的参数-name
未加引号并包含一个全局字符。shell 应用路径名扩展并给出无意义的参数来查找。
文件名不能包含斜杠。的论点-name
即使被引用也不起作用。如果 GNU find 可用,-path
可用于指定 glob 模式files/*
,但这并不意味着“名为 files 的目录中的文件”,因为您需要-regex
. 便携式解决方案更难。
您需要指定一个或多个find
开始路径。
假设您真正想要的是让 shell 执行重定向,这是 GNU find 的一种方法。
find . -type f -regex '.*foo/[^/]*$' -exec sh -c 'for x; do ./stagger <"$x"; done' -- {} +
这可能是使用find
(-depth
并且-prune
不适用于此)的最佳便携方式:
find . -type d -name files -exec sh -c 'for x; do for y in "$x"/*; do [ -f "$y" ] && ./stagger <"$y"; done; done' -- {} +
如果您使用的是 Bash,那么这个问题非常适合仅使用globstar
模式而不是find
.
#!/usr/bin/env bash
shopt -s extglob globstar nullglob
for x in **/files/*; do
[[ -f "$x" ]] && ./stagger <"$x"
done