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


229

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

像这样:

.  ..  .bash_history  .ssh  updater_error_log.txt

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

.  
..  
.bash_history  
.ssh  
updater_error_log.txt

3
ls旨在显示供人类使用的列表。如果您将ls用于其他任何目的(例如,在脚本中进行迭代以获取文件列表),则肯定是使用了错误的工具。
朱利诺

2
@juliano-实际上将由python脚本使用。您为什么称其为错误工具?
fixxxer 2010年

1
@fixxer管道ls到python 的那一刻,ls每行将输出一个文件,正如我在回答中解释的那样。
Peter G.

6
@fixxxer:那您确实使用不正确。它格式化清单以便在用户终端中输出。它可以替换文件名中的特殊字符,可以省略具有特殊含义的字符,等等。换句话说,ls 格式化用户列表。您需要未格式化的文件名。是否没有使用python'glob'模块的特殊原因?docs.python.org/library/glob.html 还有'fnmatch','dircache'等。
朱利诺

@fixxer您实际上已经做出ls输出到pythonpython并观察到了单行输出吗?
Peter G.

Answers:


430

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

ls -1a

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

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

2
+1我不知道-1(-l是(不是)),它在手册页中显示,但我一直都在阅读它:)
slashmais 2010年

@slashmais-啊,好点-容易出错。我在答案中做了澄清。
Bert F

1
@dty:对于GNU,您会在ls --help输出中记录此文件...始终安装;-)
Tony Delroy,2010年

3
在Google上搜索linux ls one file per line,这是头条。无法相信所选答案的罗word程度,或者该答案的票数少于吸引人的票数。ls -1tw
crantok

3
ls-1当输出未连接到终端时,默认为行为。
codeforester

131

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

ls -a | cat

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

因此,如果您通过管道ls -a传输到python,它无需任何特殊措施即可工作。


2
哇,真是太好了 相对于可接受的答案的优势-这个实际上可以在Android / adb shell上运行-那里ls只是一些简化的版本,因此不支持-1
mkilmanas 18-10-6

但是,如何避免在输出中显示.和和..“文件”?
matanster

@matanster:这取决于您是否要查看所有的点文件?如果没有,只需删除-a选项。
彼得·

29

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它不会处理不可打印的字符。您仍将无法可靠地列出文件名包含换行符的目录,但是很少这样做(记住这是一个潜在的安全问题,而不是可用性问题)。

在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挂载远程文件系统,然后在本地工作。


我通过SSH连接到远程计算机。我发现没有办法在一行上的远程计算机上执行像os.listdir这样的python函数。因此,这个问题。我不想编写只列出文件的脚本。还有其他解决此问题的方法吗?
fixxxer 2010年

@fixxxer:ssh确实会改变这种情况,这是您在原始问题中应该提到的事情!我认为sftp适合您的用例。
吉尔(Gilles)“所以,别再邪恶了”,2010年

对不起,我很困惑。有没有办法在“ command_line”中插入密码?
fixxxer 2010年

@fixxxer:我不知道,ssh的作者对以纯文本格式存储的密码不满意,并且往往不那么容易。您应该真正设置基于密钥的身份验证(网络上有很多教程,superuser.com上对此也有疑问)。
吉尔斯(Gilles)'所以

11

您可以使用 ls -1

ls -l 也会做工作


最重要的答案已经提到您所说的确切内容。这个问题也明确指出ls -l不应使用。
DevX

2

容易,只要您的文件名不包含换行符即可:

find . -maxdepth 1

如果将其传递到另一个命令中,则您可能更希望使用空字节而不是换行符来分隔文件名,因为文件名中不能出现空字节(但可以使用换行符):

find . -maxdepth 1 -print0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.