ls -a
命令获取目录中的文件名,但输出结果是单行显示的。像这样:
. .. .bash_history .ssh updater_error_log.txt
我需要一种内置的替代方法来获取文件名,每个文件名都在新行中,就像这样:
.
..
.bash_history
.ssh
updater_error_log.txt
使用-1
选项(注意这是数字“1”,而不是小写字母“L”),像这样:
ls -1a
首先,请确保您的ls
支持-1
。GNU coreutils(安装在标准Linux系统上)和Solaris都支持;但如果不确定,请使用man ls
或ls --help
或查看文档。例如:$ man ls
...
-1 list one file per line. Avoid '\n' with -q or -b
ls --help
的输出中找到这个记录...总是已安装的;-) - Tony Delroyls -1
胜利了。 - crantokls
默认使用 -1
行为。 - codeforester是的,您可以轻松地使ls
输出每行一个文件名:
ls -a | cat
解释:命令ls
会感知输出是否是在终端还是文件或管道,并进行相应的调整。
因此,如果你将ls -a
导出到python中,不需要任何特殊措施即可运行。
ls
仅是某些简化版本,因此不支持“-1”。 - mkilmanasLs 的输出是设计给人类阅读的,您不应该解析其输出。
在 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
不会损坏非可打印字符。您仍然无法可靠地列出文件名包含换行符的目录,但这很少做(将其记为潜在的安全问题而不是可用性问题)。
在Python中(请注意,需要转义remote_dir
中的shell元字符):
command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")
如需进行更复杂的交互,请在文档中查找sftp的批处理模式。
在某些系统上(Linux、Mac OS X,可能还有其他的Unix系统,但绝对不是Windows),另一种方法是通过ssh挂载远程文件系统,使用sshfs,然后在本地操作。
ls -1
。
ls -l
也可以完成工作。ls -l
。 - DevX你也可以使用ls -w1
这允许设置列的数量。 来自ls的manpage:
-w, --width=COLS
set output width to COLS. 0 means no limit
ls | tr "" "\n"
只要您的文件名不包含换行符,这个任务就很简单:
find . -maxdepth 1
如果你将这个命令管道传递到另一个命令中,你应该优先选择使用空字节来分隔文件名,而不是换行符,因为文件名中不能出现空字节(但可以有换行符):
find . -maxdepth 1 -print0
在终端上打印这个内容可能会显示为一行,因为通常不会打印空字节。一些程序可能需要特定的选项来处理以空字节分隔的输入,例如sort
的-z
选项。您自己的脚本同样需要考虑到这一点。
-1
开关是显而易见的方法,但值得一提的是,另一个选项是在双引号内使用echo
和命令替换,它保留了空格(这里是\n
):
echo "$(ls)"
此外,如何使用ls
命令的行为在这里中提到:
如果标准输出是终端,则输出按列(垂直排序)列出,并将控制字符输出为问号;否则,每行列出一个输出,并将控制字符原样输出。
现在你知道为什么重定向或管道输出一行一行地进行了。
ls
管道传递到Python时,ls
会按照我在答案中解释的方式每行输出一个文件。 - Peter G.