如何在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.stat
或os
来获取文件元数据。 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只给出由空格分隔的文件名,所以输出显示为每行一个文件名。