【问题标题】:Bash: How to print the filename of the nth file in a folderBash:如何打印文件夹中第 n 个文件的文件名
【发布时间】:2014-09-02 19:35:52
【问题描述】:

我在文件夹的第 773 个文件中遇到解析错误。是否可以在bash中打印文件名?

我试过用它来打印它,但它返回一个空白。

files=(/path/to/files)
echo "${files[773]}"

【问题讨论】:

    标签: bash terminal


    【解决方案1】:

    非常接近,但是您实际上需要做一个 glob 来将列表收集到您的数组中,而不是拥有一个只有一个元素的列表(父目录):

    files=( /path/to/files/* )
    echo "${files[772]}"
    

    如果您想以一种以人类可读的方式表示不可打印字符的方式表示您的文件名,echo 是错误的工具。相反,请考虑:

    printf '%q\n' "${files[772]}"
    

    如果您的路径来自变量,请务必引用其扩展名,但不是全局字符:

    files=( "$dir"/* )
    

    【讨论】:

    • @EtanReisner,确实,它应该...如果提问的人在问题本身中使用了 1-indexed 数学。
    • (这...是的,让人们自己学习这些东西是相当卑鄙的,但是有效;我已经做出了适当的更正)
    • @squeamishossifrage,这是完全必要的,尽管还要添加第二个结束语。否则,如果文件名包含多个空格、可以扩展的全局序列或 IFS 内的任何字符,则文件名将打印错误。 (顺便说一句——你知道带换行符的文件名在 UNIX 中是有效的吗?但如果你不引用你的变量扩展,echo 将永远不会告诉你它们存在......)
    • @squeamishossifrage,啊,实际上我之前给出了错误的复制步骤。 touch 'foo * bar' baz qux; files=( foo* ); echo ${files[@]}echo "${files[@]}" 相同将更好地展示差异(在 bash 上,而不是 zsh;zsh 打破 POSIX 以提供更符合用户期望的行为)。
    • @Dr.jacky,哪个外壳?在 bash 中,shopt -s globstar 使 ** 用于递归。 (顺便说一句,可以说这应该是它自己的问题——在某些解释中,它已经是它自己的问题;请参阅recursively look for files with a specific extension 上教授该技术的 f/e 答案)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 2017-04-22
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多