在以dash开头的目录中查找

l0b*_*0b0 10 unix shell escaping find

find将文件名开头的短划线解释为选项的开头.使用熟悉的--技巧不起作用,因为选项在文件名之后,引用无效,并且替换第一个破折号\-也不起作用.通常鼓励用户在这些文件名之前./,但如果我不知道给定路径是绝对路径还是相对路径,我该怎么办?

编辑:一个解决方案是find "$(readlink -f -- "$test_filename")",但它很难看.有更好的想法吗?

编辑2:感谢您的建议.以下是这项工作产生的两个脚本: safe-find.sh ; safe-count-files.sh

thk*_*ala 6

如果它在脚本中,您可以随时检查它.例如bash,ksh或zsh:

if [[ "$DIR" = -* ]]; then
    find ./"$DIR"
else
    find "$DIR"
fi
Run Code Online (Sandbox Code Playgroud)

以更简洁的形式(对于bash,ksh93或zsh):

find "${DIR/#-/./-}"
Run Code Online (Sandbox Code Playgroud)

您甚至可以使用脚本的参数执行此操作,如果它们都应该是目录:

find "${@/#-/./-}"
Run Code Online (Sandbox Code Playgroud)


Fre*_*Foo 5

这可能看起来有点便宜,但我实际上推荐readlink你已经找到的解决方法.根据Unix标准,

以' - '(...)和所有后续参数开头的第一个参数应解释为 表达式

所以--确实行不通.thkala的解决方案也可以使用,但我发现它的可读性较差.如果你做了很多find调用,它可能会更快.