【问题标题】:Save name of last file that matches a pattern to variable in bash将与模式匹配的最后一个文件的名称保存到 bash 中的变量
【发布时间】:2018-09-07 11:54:17
【问题描述】:

我拒绝解析ls 输出,因为它不稳定。

readfind 的第一次尝试失败:

read VARIABLE < $(find ./ -type f -name "PATTERN" | sort -r)

但它会导致不明确的重定向。

第二次尝试失败:它保存了/boot 文件,不知道为什么,我不在/

find ./ -type f -name "PATTERN" | sort -r | read VARIABLE

第三次尝试失败:使用 subshel​​l

{ read VARIABLE; } < $(find ./ -type f -name "PATTERN" | sort -r)

没有变化。

我终于实现了,我想要的:

variable=$(find ./ -type f | sort -r | head -1)

但是这个解决方案并不让我满意,因为使用head 提取第一行看起来很难看。
此外,我很可能只需要第二行(我知道head -2 | tail -1 会得到什么)

我想知道是否可以使用它的一些变体:

{ read line1 ; read line2; } < $(find ./ -type f -name "PATTERN" | sort -r)

【问题讨论】:

    标签: bash find pipe


    【解决方案1】:

    Process Substitution 的语法定义错误,它是 &lt;()不是 &lt;$()。您需要了解&lt;() 将命令输出放在/var/tmp 下的临时文件或文件描述符/dev/fd/* 下,具体取决于您的操作系统。要使用read 命令对文件进行操作,您需要使用前导&lt; 重定向其内容,这会将文件内容放到read 命令的标准输入流中以读取该行。

    read -r lastfile < <(find ./ -type f -name "PATTERN" | sort -r)
    

    请记住,进程替换是 bourne again shell 功能,在符合 POSIX 标准的 bourne shell sh 中不可用。

    就其他尝试而言,使用管道的尝试将永远无法工作

    find ./ -type f -name "PATTERN" | sort -r | read VARIABLE
    

    因为VARIABLE 是在管道的子shell 中设置的,并且永远不会传播到父shell。如果您在子 shell 中读取它时打印它,它会起作用。

    find ./ -type f -name "PATTERN" | sort -r | { read -r lastfile; echo "$lastfile" ; }
    

    其中一个包含大括号 { ;} 的复合语句存在同样的问题,即使用不正确的语法进行进程替换,这应该是

    { read -r lastfile; } < <(find ./ -type f -name "PATTERN" | sort -r)
    

    一个有两个read 命令

    { read -r file1 ; read -r file2; } < <(find ./ -type f -name "PATTERN" | sort -r)
    

    【讨论】:

      猜你喜欢
      • 2011-02-07
      • 2015-11-22
      • 2020-12-08
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      相关资源
      最近更新 更多