【问题标题】:graceful degradation for globbing on terminal终端上通配的优雅降级
【发布时间】:2009-10-20 18:27:27
【问题描述】:

只要 glob 模式匹配失败,它就会停止整个作业。例如,

$ mv *.jpg *.png folder1 && blahblah
mv: cannot stat `*.jpg': No such file or directory

*.png 没有移动到文件夹 1 并且 blahblah 没有运行。

下面的脚本仅适用于 .[A-z]* 和 * 都成功的情况。

#!/bin/bash
cd $1
du -sk .[A-z]* *| sort -rn | head

我如何让 globbing 优雅地失败,最多只显示警告,但从不停止工作?

【问题讨论】:

    标签: bash shell terminal glob graceful-degradation


    【解决方案1】:

    在 Bash 中,shopt -s nullglob 将允许失败的 glob 扩展为无错误。

    【讨论】:

    • nullglob 解决了大部分问题,但不是全部;如果所有 glob 都不匹配,您最终会得到类似 mv folder1 && blahblah 的内容(您会从 mv 收到使用消息,并且 blahblah 不会运行)。完全解决它更加复杂,部分原因是您必须定义如果没有文件可以操作应该发生什么。你最终会做file_list=(*.jpg *.png); if [[ ${#file_list[@]} -gt 0 ]]; then mv "${file_list[@]}" folder1 && ...之类的事情
    【解决方案2】:

    然后使用循环。亲吻

    for files in jpg png
    do
      mv *.${files} /destination 2>/dev/null && do_something 
    done
    

    【讨论】:

    • 这不仅速度较慢,而且仍然发出mv: cannot stat '*jpg': No such file or directory
    • 请在发表评论之前再仔细查看整个内容。我很高兴知道它很慢。但它完成了工作。例如,单个命令“mv *jpg *png folder && touch dummy”在 OP 的情况下将不起作用。但是如果你引入一个 for 循环,就会创建一个虚拟文件,因为现在,我们正在逐个处理每种文件类型。
    • 如果*.jpg*.png glob 都是非空的,现在运行do_something 两次,并且仍然发出消息。我想你可能打算写mv *.$files 2>/dev/null && do_something
    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 2013-01-18
    • 1970-01-01
    • 2010-10-07
    相关资源
    最近更新 更多