Bash:如何打印文件夹中第n个文件的文件名

3

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

我尝试使用以下命令来打印文件名,但返回为空白。

files=(/path/to/files)
echo "${files[773]}"
2个回答

7

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

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

如果您想以一种能够将非打印字符以人类可读的方式表示出来的方式来表示文件名,那么使用echo是错误的工具。相反,请考虑使用以下方法:

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

如果您的路径来自变量,请确保引用其扩展,但不要引用通配符字符:

files=( "$dir"/* )

1
@EtanReisner,确实,如果提问者在问题本身中使用了1索引数学,则应该这样做。 - Charles Duffy
1
(这样做可能有点刻薄,但确实有效;我已经进行了适当的更正) - Charles Duffy
1
@squeamishossifrage,这是完全必要的,但也需要添加第二个闭合符号。否则,如果文件名包含多个空格或可以扩展的glob序列或IFS内的任何字符,则文件名将打印错误。(顺便说一句 - 你知道UNIX中换行符的文件名是有效的吗?但如果你不引用变量扩展,echo永远不会告诉你它们存在...) - Charles Duffy
1
@squeamishossifrage,啊,我之前给出的重现步骤有误。touch 'foo * bar' baz qux; files=( foo* ); echo ${files[@]}与使用echo "${files[@]}"的结果将更好地展示它们之间的差异(在bash上,而不是zsh;zsh打破了POSIX以提供更符合用户期望的行为)。 - Charles Duffy
1
@Dr.jacky,用哪种shell?在bash中,使用shopt -s globstar使**用于递归。 (顺便说一句,可以认为这应该是自己的问题-- 在某些解释中,它已经成为自己的问题;请参见f/e答案,教授有关递归查找特定扩展名的文件的技术) - Charles Duffy
显示剩余6条评论

0

你需要执行bash ls命令来完成这个操作:

ls | sed -n 773p

你当然可以将它写入一个变量中:

MY_FILE=$(ls | sed -n 773p)

而且,你也可以使用变量代替773。 希望能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接