【问题标题】:get the first word as result of ls -l得到第一个单词作为 ls -l 的结果
【发布时间】:2014-09-28 10:13:05
【问题描述】:

我需要使用ls -l,并且我希望只使用文件名的第一个单词,例如这样的结果

-rw-r--r--    1 root     root             9 Sep 21 23:11 best file 1.txt

我只想要一个

best

作为结果,因为我需要将此值放入变量中。如果有其他方法而不是使用ls -l,也可以。

...很抱歉再次打扰您...如果文件在子目录下,我该如何从结果中隐藏该文件夹?谢谢

【问题讨论】:

  • 不要解析ls的输出
  • @avinash:一些理由可能有用;)
  • @OliverCharlesworth 请参阅我的答案中的链接。

标签: linux bash ls


【解决方案1】:

您不需要使用ls -l (L)。

改为使用ls -1(第一个),它只输出文件的名称,然后用cut过滤掉第一列:

ls -1 | cut -d' ' -f1
    ^
    number one, not letter L

要将值存储到变量中,请执行以下操作:

var=$(ls -1 | cut -d' ' -f1)

注意解析ls不是一件好事:列数可能会有所不同,等等。您可以在Why you shouldn't parse the output of ls中阅读有关该主题的更多信息

更新

注意,甚至不需要使用-1(一),单独使用ls就足够了:

ls | cut -d' ' -f1

正如下面的BroSlow comments“因为它们是通过管道分隔的 EOL(行尾)”

【讨论】:

  • 非常感谢大家,所有解决方案都完美运行,感谢您的提示
  • 不要认为-1 在这里实际上做任何事情,因为无论如何它们都是通过管道分隔的。
  • @BroSlow 非常正确。已更新,非常感谢您的解释。
【解决方案2】:

如果您只有一行要输出,这将正常工作:

var=`ls -l | awk '{ print $9 }'`
echo ${var}

或者您需要使用grep 来过滤您的输出以获得正确的文件。

【讨论】:

  • 伙计们,我综合了你们所有的解决方案,最终解决了这个问题……非常感谢你们所有人的努力和支持!
【解决方案3】:
set -- $(ls -l)
echo ${11}    # Assumes the file is the FIRST one listed.

应该做的伎俩。但我不确定这是否真的是你想要的。一方面,ls -l 还会打印一个额外的标题行。为什么你说你需要使用 ls -l?如果你能说出实际问题,也许我们可以一起找到更好的解决方案……

【讨论】:

    【解决方案4】:

    awk可以帮你挑第一个字;

    ls | awk '{print $1}'
    

    【讨论】:

      【解决方案5】:

      试试:

      ls -al|awk 'NR==4{ print $9 }'
      

      第 4 行将包含第一行文件。 $9 表示第 9 列将有所需的单词。

      【讨论】:

      • 这里NR==4有什么用?
      • 您只需要第一个文件的名称。前 3 行包含 .或 .. 等。因此行号 (NR) 4 具有第一个文件的详细信息。第 9 列有它的名字。
      • 如果单独解析 ls 不好,那么在解析 ls 时考虑到 ., .. 等就更危险了。我推荐阅读Why you shouldn't parse the output of ls
      • 我同意你的观点,但 OP 想要 ls -l。我认为 OP 应该听取您的建议并使用您前面提到的 ls -1 (one)。
      猜你喜欢
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-10
      • 2020-07-03
      • 1970-01-01
      • 2015-02-05
      相关资源
      最近更新 更多