我的命令看起来像这样
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
不会导致任何争论。
在以下情况下会发生这种情况:
$PATH
未设置$PATH
设置为空字符串$PATH
仅包含空格、制表符或换行符(默认值$IFS
)。
由于$PATH
是包含以冒号分隔的目录列表的特殊变量,用于查找包含该find
命令的可执行文件,因此我们可以排除 3 个,最有可能排除 2 个(除非find
当前目录中有命令),否则您会收到错误find: command not found
。
当$PATH
未设置时(1
上面),在(例如or的谓词execvp()
通常使用的)和某些 shell 中(包括通常在这些 shell 上找到的 Korn 和 Bourne shell)env
find
-exec
传统的操作系统),find
可以通过默认搜索路径中的搜索找到(像 shellbash
这样的不这样做,但$PATH
在启动时未设置时设置(尽管不导出)为默认值)。
在这里,我想你想要:
$PATH
使用与存储目录名称不同的变量名称(例如$dir
)- 一定要引用你的变量
${dir:-.}
如果您想默认为当前目录(如果$dir
为空或未设置),请使用。- (也许还调查为什么
$PATH
变量未设置,这是非常不寻常的)
所以:
dir=some-dir
find "${dir:-.}" -name "$FILE.log"
请注意,它假设$dir
不以 开头-
,并且不是find
运算符(如!
, (
, )
),并且$FILE
不包含通配符(*
, ?
, [...]
)(请注意使用双引号而不是单引号,$FILE.log
因为我假设您想要查找名为something.log
wheresomething
的内容的文件$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"