我是一个沉重的命令行用户,并在我的构建系统脚本中广泛使用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
函数,如果我忘记了,添加“./”,但我失败了。谢谢你的帮助。 :)
答案 0 :(得分:17)
安装GNU find。
$ brew install findutils
$ alias find=gfind
是的,它有效!
答案 1 :(得分:11)
如果您不能自律使用find
'正确',那么为什么不在系统之前的PATH上的目录中安装GNU find
(来自findutils
){ {1}}命令。
我曾经拥有自己的find
私有变体,如果列表中的最后一项不是目录,它会将文件复制到当前目录。我将它保存在我的个人cp
目录中多年 - 但最终将其删除,因为我不再使用该功能。 (我的'cp.sh'写于1987年,在1990年和1997年两次编辑,作为版本控制系统符号更改的一部分。我想我在1998年左右删除了它。脚本的主要问题是{{1}在将文件复制到另一个文件和将两个文件复制到当前目录之间是不明确的。)
考虑将自己的包装器编写到bin
:
cp file1 file2
第二行说“如果参数1不是目录,那么调整命令行参数以在命令的其余部分之前包括点。如果您键入以下内容将会引起混淆:
find
因为不存在的目录不是目录,脚本会在命令行中添加点 - 这是我停止使用私有#!/bin/sh
[ ! -d "$1" ] && set -- . "$@"
exec /usr/bin/find "$@"
命令的原因。
答案 2 :(得分:6)
如果您必须将其称为“查找”,那么您需要:
alias find=/usr/bin/find\ .
在您的.profile或.bash_profile或....在Mac OSX上替换真实路径(如果不是/ usr / bin / find)。输入完整路径以避免循环(bash通常会解释alias find=find
没有问题,但最好确定。)
但你最好不要命名别名find
(findl,myfind等),因为如果你在另一个系统上尝试它,它将成为你的习惯和麻烦。
答案 3 :(得分:4)
find ./ -name "*.plist"
编辑:嗯,我可能误解了这个问题!如果你疯了,如何通过shell脚本模拟它?我经常在〜/ .bin中保留随机实用程序脚本,这是我的PATH中的第一件事。如果您有类似的设置,也许您可以执行以下操作:(未经测试!)
#!/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
答案 4 :(得分:2)
我建议如果您正在编写脚本(将来某个时候更可能从一个系统迁移到另一个系统),您应该尝试使用更具体的命令形式,即指定“ “。而不是依赖于默认值。出于同样的原因,我甚至可能会建议编写sh
脚本,而不是依赖bash
脚本,而这些脚本可能无法在任何地方安装。
答案 5 :(得分:1)
这可能不是你想要的,但如何:alias find="find ."
或选择新名称(findl
以查找本地?)
答案 6 :(得分:1)
您可能希望运行此链接中的命令:https://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os-x/
它有点过时,例如我发现我根本不必在路径中添加许多命令。
这可以让您的系统使用findutils
包中的非BSD查找实用程序,同时还安装您可能需要的其他工具来解决您的问题。