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

fix*_*xer 209 linux shell ls

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

像这样:

.  ..  .bash_history  .ssh  updater_error_log.txt
Run Code Online (Sandbox Code Playgroud)

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

.  
..  
.bash_history  
.ssh  
updater_error_log.txt
Run Code Online (Sandbox Code Playgroud)

Ber*_*t F 394

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

ls -1a
Run Code Online (Sandbox Code Playgroud)

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

$ man ls
...
       -1     list one file per line.  Avoid '\n' with -q or -b
Run Code Online (Sandbox Code Playgroud)

  • 在Google上搜索"linux ls每行一个文件",这是最热门的文章.无法相信选择的答案是多么的罗嗦,或者这个答案的选票少于管道上的答案.`ls -1` ftw. (3认同)
  • 当输出未连接到终端时,`ls`默认为`-1`行为. (3认同)
  • +1我不知道-1(-l是的(不是一个))它显示在手册页中,但我一直在阅读它:) (2认同)

Pet*_* G. 124

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

ls -a | cat
Run Code Online (Sandbox Code Playgroud)

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

  • 哇,这太棒了.优于已接受的答案 - 这个实际上适用于Android/adb shell - 其中`ls`只是一些精简版本,所以不支持`-1` (2认同)

Gil*_*il' 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
Run Code Online (Sandbox Code Playgroud)

这会在每行打印一个文件名,与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")
Run Code Online (Sandbox Code Playgroud)

对于更复杂的交互,请在文档中查找sftp的批处理模式.

在某些系统(Linux,Mac OS X,也许是其他一些unices,但绝对不是Windows)上,另一种方法是通过ssh与sshfs挂载远程文件系统,然后在本地工作.


小智 10

您可以使用 ls -1

ls -l 也会做这项工作

  • 最上面的答案已经提到了您所说的确切内容。该问题还明确指出不应使用“ls -l”。 (3认同)

smi*_*ael 10

您还可以使用ls -w1

这允许设置列数。来自 ls 的联机帮助页:

   -w, --width=COLS
          set output width to COLS.  0 means no limit
Run Code Online (Sandbox Code Playgroud)