我是一个沉重的命令行的用户和使用 find 命令进行了广泛我的建立系统脚本。但是Mac OS X上的时候我不能集中我经常得到输出这样的:

$ find -name \*.plist
find: illegal option -- n
find: illegal option -- a
find: illegal option -- m
find: illegal option -- e
find: *.plist: No such file or directory

基本上,我忘了添加一点点:

$ find . -name \*.plist

因为BSD find 需要的道路和GNU find 不(假定当前的目录,如果没有指定一个)。我使用Linux,Mac OS X和Cygwin往往在同一时间,所以它是非常有利于我有我所有的工具的行为相同。我尝试写一bash find 功能,增加了"/" 如果我忘记了,但我失败了。谢谢你的帮助。:)

有帮助吗?

解决方案

如果您不能约束自己使用find“正确”,那么为什么不安装GNU findutils在未来的系统cp命令你的路径中的目录(从bin)。

我曾经有过的cp file1 file2我个人的变种,将文件复制到当前目录,如果在列表中的最后一个项目是不是一个目录。我一直在多年我个人<=>目录 - 但最终删除它,因为我已经不再使用的功能。 (我的“cp.sh”写于1987年和编辑的两倍,在1990年和1997年,为改变版本控制系统符号的一部分。我认为我删除了1998年各地的脚本中的主要问题是,<=>是复制一个文件在另一个和复制两个文件到当前目录之间不明确的。)

考虑编写自己的包装为<=>:

#!/bin/sh
[ ! -d "$1" ] && set -- . "$@"
exec /usr/bin/find "$@"

在第二行说:“如果参数1不是一个目录,然后调整命令行参数包括提前命令其余的点那将是混乱,如果你曾经键入:

~/bin/find /non-existent/directory -name '*.plist' -print

因为不存在的目录不是一个目录和脚本将增加点到命令行 - 那种原因,我停止使用我的私人<=>命令

其他提示

安装GNU找到代替。

$ brew install findutils
$ alias find=gfind

耶,它的作品!

如果你一定要说是“发现”,然后你想:

alias find=/usr/bin/find\ .

在您的.profile或.bash_profile文件或...。替换在Mac OSX的真实路径(如果不是在/ usr / bin中/查找)。输入完整的路径,以避免周期(bash的通常会解释alias find=find没有问题,但最好是肯定)。

但你最好不要定义别名find(findl,myfind等),因为如果你尝试另一个系统上它会成为你的一种习惯和麻烦。

find ./ -name "*.plist"

修改:嗯,我可能误解的问题!如果你是疯了,怎么样通过一个shell脚本仿效呢?我经常保持〜/ .bin文件随机效用的脚本,这是我的路径中的第一件事情。如果你有一个类似的设置也许你可以这样做:(!未经测试)

#!/bin/sh
# remapping find!
CMD=`echo $1 | cut -c 1`
if [ $CMD = '-' ]
then
# pwd search
  /usr/bin/find ./ $*
else
# regular find
  /usr/bin/find $*
fi

我建议,如果你正在写的脚本(这是更可能从一个系统迁移到另一个将来某个时候),你应该尝试使用命令的更具体的形式,即指定“ “。而不是依赖于默认。出于同样的原因,我甚至建议编写脚本sh,而不是依靠bash这可能不是随处安装。

这可能不是你想要的,但怎么样:alias find="find ."

或选择新名称(findl为寻找本地?)

你可能需要运行命令现在这个的链接: https://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os-x/

它是有点过时,例如我发现我没有添加了许多命令我的道路。

这涵盖了你的问题通过具有系统使用的非BSD找到实用工具的 findutils 包,同时,还安装其他工具,你可能希望为好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top