使用 GNUfind或兼容(-iname无论如何已经是 GNU 扩展)的一种方法可能是将函数定义为:
findn() (
if [ -t 1 ]; then # if the output goes to a terminal
action=-print # simple print for the user to see
else
action=-print0 # NUL-delimited records so the output can be post-processed
fi
first=true
for arg do
if "$first"; then
set -- "$@" '('
first=false
else
set -- "$@" -o
fi
set -- "$@" -iname "*$arg*"
shift
done
"$first" || set -- "$@" ')'
exec find . "$@" "$action"
)
findn() (
if [ -t 1 ]; then # if the output goes to a terminal
action=-print # simple print for the user to see
else
action=-print0 # NUL-delimited records so the output can be post-processed
fi
first=true
for arg do
if "$first"; then
set -- "$@" '('
first=false
else
set -- "$@"
fi
if [ "$arg" = ! ]; then
set -- "$@" !
else
case $arg in
(*[][*?\\]*)
# already contains wildcard characters, don't wrap in *
set -- "$@" -iname "$arg"
;;
(*)
set -- "$@" -iname "*$arg*"
;;
esac
fi
shift
done
"$first" || set -- "$@" ')'
exec find . "$@" "$action"
)
您的解决方案适用于
xargs
:还是我错过了什么?
如果你稍微修改你的函数,你可以在你的
find
命令中添加额外的参数:例子:
使用 GNU
find
或兼容(-iname
无论如何已经是 GNU 扩展)的一种方法可能是将函数定义为:然后您可以将其用作:
查看包含or的文件名(如果您想要同时包含and的文件名,请将其更改为上面的名称)。
foo
bar
-o
-a
foo
bar
和:
如果要对找到的每个文件应用命令
findn
。对于同时执行和不执行的变体:
接着:
对于同时包含
foo
andbar
和 not的文件名baz
。在那个变体中,我还做了这样的设置,如果参数包含通配符,则按原样处理,因此您可以执行以下操作:
查找不以 bar开头的文件。如果您使用的是
zsh
shell,则可以创建一个别名:要禁用允许您编写的该命令的通配符:
您可能希望创建一个脚本(这里一个
sh
脚本就足够了,因为该语法是 POSIX)而不是一个函数,因此可以从任何地方调用它,而不仅仅是您的 shell。