我使用ls -a命令获取目录中的文件名,但是输出在一行中。
是这样的:
. .. .bash_history .ssh updater_error_log.txt
我需要一个内置的替代方法来获取文件名,每一个在一个新的行,像这样:
.
..
.bash_history
.ssh
updater_error_log.txt
我使用ls -a命令获取目录中的文件名,但是输出在一行中。
是这样的:
. .. .bash_history .ssh updater_error_log.txt
我需要一个内置的替代方法来获取文件名,每一个在一个新的行,像这样:
.
..
.bash_history
.ssh
updater_error_log.txt
当前回答
Ls是为人类使用而设计的,您不应该解析它的输出。
在shell脚本中,在少数情况下,解析ls的输出是实现预期效果的最简单方法。由于ls可能会破坏文件名中的非ascii字符和控制字符,因此这些情况属于不需要从ls获取文件名的情况的子集。
在python中,绝对没有理由调用ls。Python内置了ls的所有功能。使用操作系统。Listdir列出目录和操作系统的内容。Stat或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,也许还有其他一些unix,但肯定不是Windows),一种不同的方法是通过ssh和sshfs挂载远程文件系统,然后在本地工作。
其他回答
你可以用ls -1
Ls -l也会做功
-1开关是显而易见的方法,但只是提一下,另一个选项是使用echo和双引号内的命令替换,保留空白(这里\n):
echo "$(ls)"
这里还提到了ls命令的行为:
如果标准输出是一个终端,则输出按列(排序)排列 垂直方向)和控制字符输出为问号; 否则,每一行和控制字符列出一个输出 按原样输出。
现在您知道为什么重定向或管道输出每行一个了。
Ls是为人类使用而设计的,您不应该解析它的输出。
在shell脚本中,在少数情况下,解析ls的输出是实现预期效果的最简单方法。由于ls可能会破坏文件名中的非ascii字符和控制字符,因此这些情况属于不需要从ls获取文件名的情况的子集。
在python中,绝对没有理由调用ls。Python内置了ls的所有功能。使用操作系统。Listdir列出目录和操作系统的内容。Stat或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,也许还有其他一些unix,但肯定不是Windows),一种不同的方法是通过ssh和sshfs挂载远程文件系统,然后在本地工作。
使用-1选项(注意这是一个“一”数字,而不是小写字母“L”),像这样:
ls -1a
不过,首先要确保ls支持-1。GNU coreutils(安装在标准Linux系统上)和Solaris;但如果有疑问,请使用man ls或ls——帮助或查看文档。例如:
$ man ls
...
-1 list one file per line. Avoid '\n' with -q or -b
很简单,只要你的文件名不包含换行:
find . -maxdepth 1
如果你要把它管道到另一个命令中,你可能更喜欢用空字节分隔你的文件名,而不是换行符,因为空字节不能出现在文件名中(但换行符可以):
find . -maxdepth 1 -print0
在终端上打印它可能会显示为一行,因为空字节通常不打印。有些程序可能需要一个特定的选项来处理以空分隔的输入,比如sort的-z。您自己的脚本同样需要考虑这一点。