【问题标题】:What does "ls -t . | while read line" mean?“ls -t . | while read line”是什么意思?
【发布时间】:2015-10-25 03:27:55
【问题描述】:

代码如下:

if test $# -eq 1
then
  if test $1 = "--exec"
  then
    ls -t . | while read line
    do
      if test -f $line -a -x $line
      then
        echo $line
      fi
    done
  fi
fi

我不明白 . 在这里ls -t . | while read line 的用处;你能解释一下吗?

【问题讨论】:

  • ls -t . 列出当前目录 (.) 中的所有非隐藏项,按最后修改日期降序排列 (-t) - explainshell.com/explain?cmd=ls+-t+。
  • ls -t 的所有输出。被重定向到读取行的输入。
  • mywiki.wooledge.org/ParsingLs 在你知道代码是关于什么之后,你应该知道你不应该使用ls解析文件名
  • 所以。与 ls 相关联?
  • 如果您的文件名都不包含换行符,您可以(并且应该)在 $line 的每个实例周围使用双引号(例如 echo "$line"),以防止出现问题和误解。如果您的任何文件名包含换行符,您的代码会将该文件名误解为两个名称——这通常会导致不愉快。在此上下文中,ls 之后的 . 是可选的;如果您不指定要处理的文件或目录,ls 将打印当前目录中的文件。

标签: shell unix pipe ls


【解决方案1】:

该行按修改时间的升序列出了当前目录中的所有文件。管道运算符将目录列表的结果发送到 while 循环,该循环将 ls 命令的每一行读入变量“line”。当我做这种事情时,我通常使用 foreach 循环,但任何一种方式都有效。

【讨论】:

  • 我明白这条线的作用,但我真正的问题是,为什么 .出现她的 ls -t 。因为我们只能这样做 ls [options] name ,所以 -t 和 .有 2 个选项?
  • @Alba:冒着重复自己的风险:. 在类似 POSIX 的 shell 中代表 当前目录。在这里,它作为 ls 命令的 操作数(非选项参数);即,ls 将在哪个目录上运行; -t 是一个 option (not 采用 option-argument),它输出(非隐藏)文件的名称/子目录按时间倒序排列(最近修改的第一个)。
  • 我的天...我把这个弄复杂了...谢谢:)
【解决方案2】:

您的代码只是打印出当前文件夹中的所有可执行文件,按修改时间排序。

一般来说,shell 脚本是非常危险的,因为您可以编写非常容易出错或风格不佳的代码,而实际上并没有意识到这一点。或者即使你这样做了,你也可能对问题没有正确的理解。

为了达到同样的目标,我会写如下:

find . -maxdepth 1 -type f -executable -printf '%T@ %p\0' | sort -zk 1nr | sed -z 's/^[^ ]* //'

它非常简洁,没有错误的余地。

【讨论】:

  • 一个聪明的解决方案;值得一提的是,您依赖于特定于 GNU 的功能 (Linux),并且 sed 命令的 output 也将是 NUL-terminated,并且文件名将以./ 为前缀(使用%f 而不是%p 仅获取文件名)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2013-08-18
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2011-01-14
  • 2014-01-12
相关资源
最近更新 更多