如何在Linux中为每个输出行列出一个文件名?

我正在使用ls -a命令来获取目录中的文件名,但是输出是在一行中。

像这样: . .. .bash_history .ssh updator_error_log.txt . .. .bash_history .ssh updator_error_log.txt

是否有一个内置的替代方法来获取文件名,每一个都在一个新的行,如下所示:

 . .. .bash_history .ssh updator_error_log.txt 

使用man ls来查看你的ls支持-1选项(即“one”数字,而不是小写字母“L” – 谢谢@slashmais),例如

http://docs.oracle.com/cd/E19082-01/819-2239/6n4hsf6oc/index.html

-1

  Prints one entry per line of output. 

GNU / Linux的ls支持它,所以使用:

 ls -1a 

是:

 ls -a | cat 

说明:命令ls检测输出是否到达terminal或文件或pipe道,并进行相应的调整。

Ls是为人类消费而devise的, 你不应该分析它的输出 。

在shell脚本中,有一些parsingls输出的例子确实是达到预期效果的最简单的方法。 由于ls可能会破坏文件名中的非ASCII和控制字符,因此这些情况是不需要从ls获取文件名的子集。

在python中,绝对没有理由调用ls 。 Python内置了ls的所有function。 使用os.listdir来列出目录的内容, os.statos来获取文件元数据。 os模块中的其他function也可能与您的问题有关。


如果您通过ssh访问远程文件,则通过sftp列出文件名称的相当健壮的方式是:

 echo ls -1 | sftp remote-site:dir 

每行打印一个文件名,与ls工具不同, sftp不会破坏不可打印的字符。 您仍然无法可靠地列出文件名包含换行符的目录,但很less这样做(请记住这是潜在的安全问题,而不是可用性问题)。

在python中(注意shell元字符必须是remote_dir转义):

 command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir remote_files = os.popen(command_line).read().split("\n") 

对于更复杂的交互,请在文档中查找sftp的批处理模式。

在一些系统上(Linux,Mac OS X,也许还有一些其他的系统,但绝对不是Windows),不同的方法是用sshfs通过ssh挂载远程文件系统,然后在本地工作。

你可以使用ls -1

ls -l也会做这个工作

很简单,只要你的文件名不包含换行符:

 find . -maxdepth 1 

如果你将这个命令转换成另一个命令,你应该更喜欢用空字节而不是换行符来分隔文件名,因为空字节不能出现在文件名中(但换行符可能):

 find . -maxdepth 1 -print0 

打印在terminal上可能会显示为一行,因为空字节不正常打印。 某些程序可能需要一个特定的选项来处理空​​分隔的input,比如sort-z 。 您自己的脚本也需要考虑到这一点。

只是为了多样性:

 ls | tr ' ' '\n' 

tr命令将所有空格转换为新行。 由于没有任何参数的ls只给出由空格分隔的文件名,所以输出显示为每行一个文件名。