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

时间:2010-10-07 22:21:12

标签: linux shell ls

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

像这样:

.  ..  .bash_history  .ssh  updater_error_log.txt

我需要一个内置的替代方法来获取文件名,每个文件名都在一个新行上,如下所示:

.  
..  
.bash_history  
.ssh  
updater_error_log.txt

7 个答案:

答案 0 :(得分:345)

使用-1选项(注意这是“一位”数字,而不是小写字母“L”),如下所示:

ls -1a

首先,请确保您的ls支持-1。 GNU coreutils(安装在标准Linux系统上)和Solaris做;但如果有疑问,请使用man lsls --help或查看文档。 E.g:

$ man ls
...
       -1     list one file per line.  Avoid '\n' with -q or -b

答案 1 :(得分:118)

是的,您可以轻松地ls每行输出一个文件名:

ls -a | cat

说明:命令ls检测输出是输出到终端还是文件或管道并进行相应调整。

因此,如果你将ls -a传递给python,它应该没有任何特殊措施。

答案 2 :(得分:28)

Ls专为人类消费而设计,you should not parse its output

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

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


如果你通过ssh访问远程文件,列出文件名的一种相当强大的方法是通过sftp:

echo ls -1 | sftp remote-site:dir

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

在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,也许是其他一些unices,但绝对不是Windows)上,另一种方法是通过带有sshfs的ssh安装远程文件系统,然后在本地工作。

答案 3 :(得分:9)

您可以使用ls -1

ls -l也会开展工作

答案 4 :(得分:2)

ls | tr "" "\n"

答案 5 :(得分:1)

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

find . -maxdepth 1

如果您将此管道传输到另一个命令中,您可能更愿意将文件名分隔为空字节而不是换行符,因为文件名中不能出现空字节(但可能会出现换行符):

find . -maxdepth 1 -print0

在终端上打印可能会显示为一行,因为通常不会打印空字节。某些程序可能需要特定选项来处理空​​分隔输入,例如sort' -z。您自己的脚本同样需要考虑到这一点。

答案 6 :(得分:0)

您也可以使用ls -w1

这允许设置列数。 来自ls的联机帮助页:

   -w, --width=COLS
          set output width to COLS.  0 means no limit