【问题标题】:How to change directory to a folder name not having alphabet letters?如何将目录更改为没有字母的文件夹名称?
【发布时间】:2015-12-08 12:45:03
【问题描述】:

我正在寻找 shell 中的简单解决方案来自动执行脚本,所有主机中的文件夹名称都不同,唯一的技巧是顶级文件夹名称是带有下划线和连字符的数字。为了切换到没有字母的目录,我无法对其进行良好的正则表达式。任何猜测(除了 extglob 或仅使用 shell 通配符模式)肯定会对我有所帮助。

例如;如何切换到cd /home/user/123_456-56/,使用通配符模式,这样我就可以避免切换到cd /home/user/123_456-56_12XyDf89/

谢谢!提前。

【问题讨论】:

  • 有了extglob,这很容易。 cd !(*[!-0-9_]*)
  • 感谢tripleee,我无法在生产环境中启用extglob。我有 1000 台服务器来运行这个脚本,必须获得启用extglob 的权限。有没有其他方法可以做到这一点,使用 shell 通配符模式?
  • @simer 是什么阻止你只为你的脚本启用它?
  • @Tensibai 没有什么可以阻止的,它只是要遵循的过程开销。
  • @simer ???它必须放在板凳上,但我很确定在你的cd 后跟shopt -u extglob(如果真的需要)之前对shopt -s extglob 的任何解决方法都将是丑陋的、脆弱的,并且会带来更多的开销。您不会通过在脚本中调用 shopt 来修改系统,它只会应用于脚本 AFAIK 的上下文。

标签: regex linux bash shell wildcard


【解决方案1】:

可以使用find

cd `find -maxdepth 1 -type d -regex '\./[!_0-9]+'`

注意 ehe -regex 必须匹配整个文件名,包括目录部分。

【讨论】:

    【解决方案2】:

    只需要一个简单的循环:

    numericdir () {
      for f in "$1${1+/}"*/; do
        case ${f#$1/} in *[!-0-9_]*/) continue;;
         *) echo "$f"; break;;
        esac
      done
    }
    
    cd "$(numericdir)"
    

    您可以传入一个目录参数来查找该目录的数字子目录。

    【讨论】:

    • @Dummy00001 你测试过这个吗?为什么说是错的?简单的 glob 模式拒绝任何包含不允许字符的文件名;任何剩余的名称都必须满足要求(尽管根据 OP 的规范,我们在第一场比赛后退出)。
    • 哦。对不起。错过了 KISS 解决方案。
    猜你喜欢
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2022-11-23
    • 2021-05-29
    相关资源
    最近更新 更多