【问题标题】:How can I make the "find" Command on OS X default to the current directory?如何使 OS X 上的“查找”命令默认为当前目录?
【发布时间】:2010-09-16 17:18:25
【问题描述】:

我是一个重度命令行用户,在我的构建系统脚本中广泛使用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 函数添加“./”,但我失败了。谢谢你的帮助。 :)

【问题讨论】:

    标签: macos bash command-line find


    【解决方案1】:

    改为安装 GNU find。

    $ brew install findutils
    $ alias find=gfind
    

    是的,它有效!

    【讨论】:

    • 这会更持久:$ echo "alias find='gfind'" >> ~/.bash_profile
    【解决方案2】:

    如果你不能训练自己“正确”使用find,那么为什么不在系统find 命令之前的PATH 目录中安装GNU find(来自findutils)。

    我曾经有我自己的 cp 私有变体,如果列表中的最后一项不是目录,它会将文件复制到当前目录。我将它保存在我的个人bin 目录中多年 - 但最终将其删除,因为我不再使用该功能。 (我的 'cp.sh' 写于 1987 年,并在 1990 年和 1997 年进行了两次编辑,作为版本控制系统符号更改的一部分。我想我在 1998 年左右删除了它。脚本的主要问题是 cp file1 file2 是在将一个文件复制到另一个文件和将两个文件复制到当前目录之间存在歧义。)

    考虑编写自己的包装器到find

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

    第二行说“如果参数 1 不是目录,则调整命令行参数以在命令的其余部分之前包含点。如果您键入会混淆:

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

    因为不存在的目录不是目录,并且脚本会在命令行中添加点——这就是我停止使用私人cp 命令的原因。

    【讨论】:

      【解决方案3】:

      如果你必须称它为“查找”,那么你想要:

      alias find=/usr/bin/find\ .
      

      在您的 .profile 或 .bash_profile 或...中。替换 Mac OSX 上的真实路径(如果不是 /usr/bin/find)。输入完整路径以避免循环(bash 通常会毫无问题地解释 alias find=find,但最好确定)。

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

      【讨论】:

      • 我什至从未尝试过这个,因为我认为 find 不能采用多条路径,因此认为我无法搜索当前路径以外的路径。非常感谢:)
      • 其实这样不好。因为如果我指定一个路径,我不太可能想要包含当前目录。
      • 你说的很明显。请注意,没有人强迫您假设“。”作为查找的默认目标,除了您自己(检查您的问题!)。
      • 不管我怎么看,我都不明白你的意思。
      • 这并不重要,因为您确实需要一个脚本,Jonathan Leffler 提供了这个脚本,并且确实是最好的答案。
      【解决方案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
      

      【讨论】:

      • 太好了 :) 谢谢。虽然不是很完美,因为它不能处理: $ find 应该转换为: $ find ./
      【解决方案5】:

      我建议,如果您正在编写脚本(将来更有可能从一个系统迁移到另一个系统),您应该尝试使用更具体的命令形式,即指定“ 。”而不是依赖默认值。出于同样的原因,我什至可能会建议编写 sh 脚本,而不是依赖可能无法在任何地方安装的 bash

      【讨论】:

      • 这是一个很好的观点。如果我没有指定路径,我真的应该在其他平台上添加一个脚本/函数来退出 find 命令。这样我就不会开始编写可能会因各种工具的不同实现而中断的脚本。
      • 出于同样的原因,我养成了使用“-print”操作的习惯,即使在 find 假设它时也是如此。
      【解决方案6】:

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

      或选择一个新名称(findl 用于查找本地?)

      【讨论】:

      • 我正要建议一个别名,但后来意识到如果您想要在 find 命令行上指定一个路径,它不会很好用。
      • 它将搜索本地目录和您指定的路径。 find 不限于一个路径参数。
      • 虽然如果我指定一个路径,我可能不希望它也搜索当前目录。
      • 这就是我为解决方案添加前缀的原因:这可能不是您想要的。我仍然认为您应该将此自定义功能绑定到自定义命令(例如 findl),以便您可以在需要时使用 OS X 行为。
      【解决方案7】:

      您可能希望运行此链接中的命令:https://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os-x/

      它有点过时了,例如我发现我根本不需要在我的路径中添加很多命令。

      这通过让您的系统使用findutils 包中的非 BSD 查找实用程序来解决您的问题,同时还安装您可能需要的其他工具。

      【讨论】:

        猜你喜欢
        • 2010-09-27
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多