mxc*_*xcl 14 macos bash command-line find
我是一个沉重的命令行用户,并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
Run Code Online (Sandbox Code Playgroud)
基本上,我忘了添加小点:
$ find . -name \*.plist
Run Code Online (Sandbox Code Playgroud)
因为BSD find需要路径而GNU find不需要(如果你没有指定,则它假设当前目录).我经常同时使用Linux,Mac OS X和Cygwin,因此让我的所有工具表现相同对我有很大好处.我试着编写一个bash find函数,如果我忘了就添加"./",但是我失败了.谢谢你的帮助.:)
odi*_*ont 18
请改为安装GNU find.
$ brew install findutils
$ alias find=gfind
Run Code Online (Sandbox Code Playgroud)
是的,它的作品!
Jon*_*ler 11
如果你不能自律使用find'正确',那么为什么不在系统命令之前在你的PATH上的目录中安装GNU find(from findutils)find.
我曾经拥有自己的私有变体,cp如果列表中的最后一项不是目录,它会将文件复制到当前目录.我将它保存在我的个人bin目录中多年 - 但最终将其删除,因为我不再使用该功能.(我的'cp.sh'写于1987年,并在1990年和1997年两次编辑,作为版本控制系统符号更改的一部分.我想我在1998年左右删除了它.脚本的主要问题cp file1 file2是复制之间模糊不清一个文件而不是另一个文件并将两个文件复制到当前目录.)
考虑编写自己的包装器find:
#!/bin/sh
[ ! -d "$1" ] && set -- . "$@"
exec /usr/bin/find "$@"
Run Code Online (Sandbox Code Playgroud)
第二行说"如果参数1不是目录,那么调整命令行参数以在命令的其余部分之前包括点.如果您键入以下内容将会令人困惑:
~/bin/find /non-existent/directory -name '*.plist' -print
Run Code Online (Sandbox Code Playgroud)
因为不存在的目录不是目录,脚本会在命令行中添加点 - 这是我停止使用私有cp命令的原因.
如果你必须将其称为'find',那么你想要:
alias find=/usr/bin/find\ .
Run Code Online (Sandbox Code Playgroud)
在你的.profile或.bash_profile或.... 在Mac OSX上替换真实路径(如果不是/ usr/bin/find).输入完整路径以避免循环(bash通常会解释alias find=find没有问题,但更好的确定).
但你最好不要命名别名find(findl,myfind等),因为如果你在另一个系统上尝试它,它将成为你的习惯和麻烦.