【问题标题】:Getting the most recent filename where the extension name is case *in*sensitive获取扩展名是大小写 *in*sensitive 的最新文件名
【发布时间】:2019-01-01 10:11:30
【问题描述】:

我正在尝试在扩展名不区分大小写的其他逗号分隔值文件中获取最新的 .CSV 或 .csv 文件名。

我正在使用以下命令实现此目的,由其他人提供,没有任何解释:

ls -t ~(i:*.CSV) | head -1

ls -t -- ~(i:*.CSV) | head -1

我有两个问题:

  1. 在这种情况下~-- 有什么用? -- 在这里有帮助吗?
  2. 当没有 .csv 或 .CSV 文件时,如何获得空白响应 文件夹?目前我得到:
    /bin/ls: cannot access ~(i:*.CSV): No such file or directory

我知道我可以测试最后一个命令的退出代码,但我想知道是否有 --silent 选项或其他东西。

非常感谢您的宝贵时间。

PS:我在网上做了很彻底的研究,但找不到答案。

【问题讨论】:

  • 忘了说它是我在 RHEL7 上使用的 Korn Shell。感谢大家的快速回答!

标签: linux bash scripting command-line-interface ksh


【解决方案1】:

~ 只是一个文字字符;意图似乎是匹配以~ 开头并以.csv 结尾的文件名,i: 是使匹配不区分大小写的标志。但是,我不知道支持该特定语法的 any shell。我知道的最接近的事情是zsh's globbing flags:

setopt extended_glob  # Allow globbing flags
ls ~(#i)*.csv

这里,(#i) 表示任何之后都应该匹配而不考虑大小写。

更新:正如@baptistemm 指出的那样,~(i:...) 是由ksh 定义的语法。

-- 是一个常规参数,被许多命令支持,这意味着后面的任何参数都不是选项,而是应该按字面意思对待。例如,ls -l 意味着ls 应该使用-l 选项来修改其输出,而ls -- -l 意味着ls 应该尝试列出一个名为-l 的文件。

【讨论】:

    【解决方案2】:

    ~(i:*.CSV) 是告诉 shell(这仅在 ksh93 中明显支持): 之后的封闭文本必须被视为不敏感,所以在这个例子中,所有这些可能性都可以。

    • *.csv
    • *.Csv
    • *.cSv
    • *.csV
    • *.CSv
    • *.CSV

    请注意,这可能在 bash 中写成 ls -t *.[CcSsVv]

    对于静默错误,我建议您在此站点中查找“标准错误 /dev/null”,这将有所帮助。

    【讨论】:

    • bash 的哪个版本支持该功能?
    • 啊,好的。我以为我尝试过ksh,但我没有意识到~ 是语法的一部分,而不是文字字符。
    【解决方案3】:

    我尝试运行类似 bashzsh 中的命令,但都没有成功,所以我无法帮助你解决这个问题,但如果你想放弃错误,你可以添加 2>/dev/nullls 命令的末尾,因此您的命令如下所示:

    ls -t ~(i:*.CSV) 2>/dev/null | head -1
    

    这会将写入 STDERR 的任何内容重定向到 /dev/null(即,将其丢弃),在您的情况下,这将是 /bin/ls: cannot access ~(i:*.CSV): No such file or directory

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 2018-10-28
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多