find 命令不起作用:“非法选项 -- n”

find 命令不起作用:“非法选项 -- n”

我的命令看起来像这样

find $PATH -name '$FILE.log' > /tmp/file-list.txt

我不断收到一条错误消息,上面写着

find: illegal option -- n

我在这里做错了什么?

答案1

从该错误消息来看,我敢打赌

  • 尽管有“linux”标签,但您可能不在基于 Linux 的系统上,因为find通常在基于 Linux 的系统上发现的实现不会使用该措辞来表示有关未知选项的错误
  • $PATH变量未设置(这表明您运行的 shell 可能是 Bourne 或 Korn shell(AT&T 实现))。

非法选择find是传统 Unix实现中常见的措辞。

那些传统的实现也要求至少有一个文件参数,然后才能使用诸如-name.

否则,-name如果它是 后的下一个参数,则将被视为选项(而不是谓词)find

并且-n(第一个选项-name是 的缩写-n -a -m -e)不是有效find选项。

因此,最有可能的是,扩展$PATH不会导致任何争论。

在以下情况下会发生这种情况:

  1. $PATH未设置
  2. $PATH设置为空字符串
  3. $PATH仅包含空格、制表符或换行符(默认值$IFS)。

由于$PATH是包含以冒号分隔的目录列表的特殊变量,用于查找包含该find命令的可执行文件,因此我们可以排除 3 个,最有可能排除 2 个(除非find 当前目录中有命令),否则您会收到错误find: command not found

$PATH未设置时(1上面),在(例如or的谓词execvp()通常使用的)和某些 shell 中(包括通常在这些 shell 上找到的 Korn 和 Bourne shell)envfind-exec传统的操作系统),find可以通过默认搜索路径中的搜索找到(像 shellbash这样的不这样做,但$PATH在启动时未设置时设置(尽管不导出)为默认值)。

在这里,我想你想要:

  • $PATH使用与存储目录名称不同的变量名称(例如$dir
  • 一定要引用你的变量
  • ${dir:-.}如果您想默认为当前目录(如果$dir为空或未设置),请使用。
  • (也许还调查为什么$PATH变量未设置,这是非常不寻常的)

所以:

dir=some-dir
find "${dir:-.}" -name "$FILE.log"

请注意,它假设$dir不以 开头-,并且不是find运算符(如!, (, )),并且$FILE不包含通配符(*, ?, [...])(请注意使用双引号而不是单引号,$FILE.log因为我假设您想要查找名为something.logwheresomething的内容的文件$FILE,而不是按$FILE.log字面命名的文件)。

答案2

$PATH是(通常 - 除非您重新定义了它,但这会破坏很多东西)冒号分隔的目录列表。find获取命令行上以空格分隔的目录列表:

find /path/to/dir1 /path/to/dir2 -name "$FILE.log"

另请注意,单引号禁止 shell 对变量进行求值,因此您可能需要双引号,$FILE.log如上所述。

您可以$PATH通过多种方式转换为空格分隔的列表,例如:

 echo $PATH | sed 's/:/ /g'

并使用命令替换将列表放入 find 命令中:

find $(echo $PATH | sed 's/:/ /g') -name "$FILE.log"

答案3

当我在谷歌上搜索相同的错误消息“非法选项 - n”时,我来到这里

我使用 MacOS,我的团队使用 Linux/Windows。他们的版本find似乎更加宽容:

损坏的命令是:

find -name "*.jsonnet"

我们通过为第一个参数引入一个点来修复它:

find . -name "*.jsonnet"

相关内容