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

像这样:

.  ..  .bash_history  .ssh  updater_error_log.txt

我需要一个内置的替代方案来获取文件名,每个文件均在新行上,这样:

.  
..  
.bash_history  
.ssh  
updater_error_log.txt
有帮助吗?

解决方案

使用 -1 选项(请注意,这是一个“一个”数字,而不是小写字母“ L”),例如:

ls -1a

不过,首先,请确保您 ls 支持 -1. 。 GNU COREUTILS(安装在标准Linux系统上)和Solaris DO;但是如果有疑问,请使用 man ls 或者 ls --help 或检查文档。例如:

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

其他提示

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

ls -a | cat

说明:命令 ls 感官是否输出为终端或文件或管道并进行相应调整。

所以,如果你管道 ls -a 为了python,它应该在没有任何特殊措施的情况下工作。

LS专为人类的消费而设计,并且 您不应该解析其输出.

在Shell脚本中,在某些情况下,解析LS的输出工作是实现所需效果的最简单方法。由于LS可能会在文件名中操纵非ASCII和控制字符,因此这些情况是不需要从中获取文件名的子集 ls.

在Python,绝对没有理由调用 ls. 。 Python拥有所有 ls内置的功能。采用 os.listdir 列出目录的内容和 os.stat 或者 os 获取文件元数据。其他功能 os 模块也可能与您的问题有关。


如果您正在通过SSH访问远程文件,则列出文件名称的一种合理的可靠方法是通过SFTP:

echo ls -1 | sftp remote-site:dir

这是每行打印一个文件名,与 ls 效用, sftp 不拧紧非打印字符。您仍然无法可靠地列出文件名中包含newline的目录,但很少这样做(请记住,这是潜在的安全问题,而不是可用性问题)。

在Python中 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),另一种方法是通过SSH启用远程文件系统 SSHFS, ,然后在本地工作。

您可以使用 ls -1

ls -l 还将完成工作

很容易,只要您的文件名不包括新线:

find . -maxdepth 1

如果您将其输送到另一个命令中,则可能更喜欢用null字节而不是newlines分离您的文件名,因为null字节不能在文件名中发生(但是newlines可能):

find . -maxdepth 1 -print0

在终端上打印该打印可能会显示为一行,因为NULL字节通常未打印。某些程序可能需要一个特定选项来处理无限制的输入,例如 sort' -z. 。您自己的脚本类似地需要考虑到这一点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top