如何从ls命令仅回显一列输出?


54

可以说当我执行ls命令时,输出为:

file1 file2 file3 file4

是否只能显示输出的特定列,在这种情况下为file2?我尝试了以下操作,但均未成功:

echo ls | $2

基本上我只想回显第二列,在这种情况下,我想回显:

file2

2
是什么一种情况,即你真的想要一个ls输出?
michas

11
通常,您永远不要解析ls。几乎总是有更好的方法来获取所需的信息。
terdon

我不会做那个陌生人的:P(对不起,我一直很喜欢这个短语)列数取决于文件和文件夹的名称,因此第二列可能是您想要的列,也可能不是,或者可能在一个列中ls,创建一些文件/文件夹后,它可能不再是您想要的。正如Terdon指出的那样,肯定有更好的方法来获得想要的东西
YoMismo

Answers:


81

以下命令会将ls输出格式化为一列

ls -1 /directory

2
但它不会给你只是一个列的OP是感兴趣的
安森

1
使其正确无误:ls -1 /directory | head -2 | tail -1ls -1 /directory | perl -ne 'print if $. == 2'
KWubbufetowicz

@KWubbufetowicz ls | sed -n '1p;q'似乎更简单
Fiximan,2016年

3
我一直在寻找答案,但不是关于OP的问题。
Michael Lang

36

您正在寻找:

ls -C | awk '{ print $2 }'

但是,假设您以后要尝试使用该文件名,请不要这样做,因为它会在包含空格的文件名上中断。相反,将文件放入一个数组中,然后获取第二个文件,这避免了必须进行任何解析:

files=(*)
printf '%s\n' "${files[1]}"

取回文件的顺序取决于的值LC_COLLATE。因此LC_COLLATE=C,如果要在所有极端情况下进行“标准”排序,则可能要先设置。


请注意,数组索引1以明智的外壳(zsh,yash,fish,csh,tcsh,rc,es ...)开头,而以0ksh和bash开头。对于可移植到所有类似Bourne的外壳的解决方案,可以使用:set -- *; printf '%s\n' "$2"代替。
斯特凡Chazelas

@StéphaneChazelas至少对于这个问题,标签包含“ bash”,因此此答案特定于该外壳。
克里斯·唐

ls -C | awk'{print $ 1}看起来给出相同的输出...为什么$ 2?
boctulus

7

您将需要添加-Cls使用单列模式当输出不是终端。 awk然后打印第二列:

ls -C | awk '{print $2}'

2

我想你在找

ls -1

它不会显示权限,所有者,组,日期,大小...,而是在单列中显示简单的文件名。


1
这个答案不仅是错误的,而且已经给出过。
斯科特

尽管我意识到对于原始问题这是错误的,但这正是我一直在寻找的东西。所以谢谢。
AntumDeluge


0

如前所述,使用列来解析ls输出不是很可靠,因为ls会根据文件名的长度和终端宽度来换行。尽管通常只显示一列元素列表很有趣。您可以使用cut命令执行此操作:

echo file1 file2 file3 file4 | cut -d" "  -f2

将显示

file2

请注意,它-d允许您选择列定界符,例如

cur -d, -f2

您可以显示逗号分隔列表的第二列。


0

假设如果要在当前路径下仅显示特定文件名,请使用以下命令

命令:

find path -maxdepth 1 -iname "filename"|sed "s/\.\///g"

0

这很棘手,因为解析ls -C取决于:

  1. 文件名长度(其本身取决于传递给的指定文件列表ls -C
  2. 端子宽度。
  3. 事实上,ls -C输出为柱状,但可以配置不同的空间数量作为字段分隔。
  4. 文件名中空格的可能性(其显示取决于ls所选的特定显示选项)。

现在,让我们先从简单的问题,(上面没有#4),假定是有在文件名没有空格。要打印第2列,这可以工作:

COLUMNS=$COLUMNS ls -C | tr -s ' ' '\t' | cut -f2

展开:

  • COLUMNS=$COLUMNS确保馈入的列长度| 与当前终端显示保持一致。将此值更改为任意值也可以,因此COLUMNS=50COLUMNS=70 将导致ls -C根据这些宽度重新排列内容。

    另一种方法是使用-w开关,例如

    ls -w${COLUMNS} -C | tr -s ' ' '\t' | cut -f2
  • tr使字段分隔符保持一致:每列之间有一个选项卡

  • cut 输出所需的列。


待解决的空白方法...
AGC

-1
num_chars=54 # offset
ls -ltr | cut -c$num_chars-

根据需要更改字符数(54),以便仅获取所需的数据。


2
阐明,使用54-告诉切到从位置54开始的每个字符;它并没有在“人类公认的”专栏里停下来
杰夫·谢勒

这不是一个坏主意。只是需要完善。
prusswan
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.