AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 761052
Accepted
yael
yael
Asked: 2023-11-09 21:25:57 +0800 CST2023-11-09 21:25:57 +0800 CST 2023-11-09 21:25:57 +0800 CST

bash +如何验证特定路径下的文件夹是否以数字结尾

  • 772

我想检查文件夹下/var/kafka所有文件夹都以数字结尾,否则我将错误退出

ls -ltr  /var/kafka
drwxr-xr-x 399 kafka kafka 28672 Nov  9 13:10 data6
drwxr-xr-x 392 kafka kafka 28672 Nov  9 13:10 data5
drwxr-xr-x 391 kafka kafka 28672 Nov  9 13:10 data1
drwxr-xr-x 405 kafka kafka 28672 Nov  9 13:10 data2
drwxr-xr-x 386 kafka kafka 28672 Nov  9 13:10 data4
drwxr-xr-x 389 kafka kafka 28672 Nov  9 13:10 data8
drwxr-xr-x 406 kafka kafka 28672 Nov  9 13:10 data7
drwxr-xr-x 397 kafka kafka 28672 Nov  9 13:10 data3

所以我创建了以下简单的代码(应该在 bash 脚本中)

for i in `  ls -ltr  /var/kafka | awk '{print $NF}' `; do  [[ ! $i  = *?[0-9] ]] && echo "ERROR folder/s not ended with number" && exit 1 ; done

但上面的例子代码太长,我想找到其他优雅的短命令来简单地验证下面的文件夹是否/var/kafka以数字结尾,

我们也可以使用awk/sed/或Perl在内衬上。

linux
  • 3 3 个回答
  • 93 Views

3 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2023-11-09T21:36:00+08:002023-11-09T21:36:00+08:00

    与zsh:

    files=( /var/kafka/*[^0-9](ND) )
    if (( $#files )); then
      print -rlu2 -- "There are files whose name doesn't end in an ASCII digit:" ' - '$^files
      exit 1
    fi
    

    bash与:相同

    shopt -s nullglob dotglob
    shopt -u failglob
    files=( /var/kafka/*[^0123456789] )
    if (( ${#files[@]} )); then
      echo>&2 "There are files whose name doesn't end in an ASCII digit:"
      printf>&2 ' - %s\n' "${files[@]}"
      exit 1
    fi
    

    要仅显示这些文件的基本名称/ tail(foo而不是/var/kafka/foo),请将和替换$^files为。$^files:t"${files[@]}""${files[@]##*/}"

    请注意,严格来说*[^0-9](或*[^0123456789]在 bash 中)匹配以非数字字符结尾的文件名,对于不以数字结尾的文件名,^*[0-9]在 zsh 中(您需要)set -o extendedglob或!(*[0-9])在 bash 中(您需要need shopt -s extglob)但鉴于文件名不能为空,这应该是等效的。

    如果您不需要在错误消息中列出这些文件,在 zsh 中,可以将其缩短为:

    if () (( $# )) /var/kafka/*[^0-9](NDY1); then
      print -ru2 "There are files whose name doesn't end in an ASCII digit"
      exit 1
    fi
    

    其中Y1停止查看第一个匹配项,并将匹配列表传递给匿名函数,如果传递至少一个参数($#不为零),则该函数返回 true。

    如果您只需要考虑目录类型的文件,仍然在 zsh 中,请添加/到 glob 限定符:

    dirs=( /var/kafka/*[^0-9](ND/) )
    if (( $#dirs )); then
      print -rlu2 -- "There are directories whose name doesn't end in an ASCII digit:" ' - '$^dirs
      exit 1
    fi
    

    bash 没有 glob 限定符,但您可以find报告名称不以数字结尾的目录类型文件:

    使用 bash4.4 或更新版本并且find支持-print0:

    readarray -td '' dirs < <(
      cd /var/kafka &&
        LC_ALL=C find . ! -name . -prune -type d ! -name '*[0-9]' -print0
    )
    if (( ${#dirs[@]} )); then
      echo>&2 "There are dirs whose name doesn't end in an ASCII digit:"
      printf>&2 ' - %s\n' "${dirs[@]}"
      exit 1
    fi
    

    使用旧版本的 bash,您始终可以循环填充数组:

    dirs=()
    while IFS= read -rd '' dir; do
      dirs=("${dirs[@]}" "$dir")
    done < <(
      cd /var/kafka &&
        LC_ALL=C find . ! -name . -prune -type d ! -name '*[0-9]' -print0
    )
    

    我们仅在 0123456789 上使用LC_ALL=Cso[0-9]匹配,而不是在其他语言环境中经常在 0 到 9 之间排序的数千个其他字符,并且还使0 或更多字符上的*in *[0-9]which 匹配 0 或更多字节。

    现在请注意,某些语言环境使用的字符编码中除了 0123456789 之外还有一些其他字符,并且编码以与 0123456789 相同的字节值结尾。例如在中国使用的 GB18030 字符集中:

    $ LC_ALL=zh_CN.gb18030 luit
    $ locale charmap
    GB18030
    $ printf %s '¾' | LC_ALL=C od -tx1 -tc
    0000000  81  30  86  36
            201   0 206   6
    0000004
    

    不管它是如何编码的,该¾字符通常都会被匹配,[0-9]因为出于明显的原因,它在 0 到 9 之间排序,而且,它的 GB18030 编码以字节 0x36 结尾,这恰好也是 ASCII 数字字符的编码6。

    因此,在 C 语言环境中,由 GB18030 编码组成的文件路径/var/kafka/¾¾¾将被视为以 ASCII 数字结尾,并且不会报告。是否应该是另一回事。

    • 4
  2. Panki
    2023-11-09T21:44:02+08:002023-11-09T21:44:02+08:00

    使用find:

    LC_ALL=C find /var/kafka -mindepth 1 -maxdepth 1 -type d -regex '.*[^0-9]$' | grep '^' \
    && echo "Error in folder name"
    

    我正在“滥用”grep以获得合理的返回码,如果有人知道更好的方法,请告诉我。

    • 1
  3. Chris Davies
    2023-11-10T05:14:42+08:002023-11-10T05:14:42+08:00

    另一种变体:

    [ -z "$(LC_ALL=C find /var/kafka -mindepth 1 -maxdepth 1 -type d \( -name '*[0-9]' -o -print -quit \))" ]
    

    $?如果所有目录名称都以数字结尾,则返回 true(为 0)

    • 0

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve