我想检查文件夹下/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
在内衬上。
与
zsh
:bash
与:相同要仅显示这些文件的基本名称/
t
ail(foo
而不是/var/kafka/foo
),请将和替换$^files
为。$^files:t
"${files[@]}"
"${files[@]##*/}"
请注意,严格来说
*[^0-9]
(或*[^0123456789]
在 bash 中)匹配以非数字字符结尾的文件名,对于不以数字结尾的文件名,^*[0-9]
在 zsh 中(您需要)set -o extendedglob
或!(*[0-9])
在 bash 中(您需要needshopt -s extglob
)但鉴于文件名不能为空,这应该是等效的。如果您不需要在错误消息中列出这些文件,在 zsh 中,可以将其缩短为:
其中
Y1
停止查看第一个匹配项,并将匹配列表传递给匿名函数,如果传递至少一个参数($#
不为零),则该函数返回 true。如果您只需要考虑目录类型的文件,仍然在 zsh 中,请添加
/
到 glob 限定符:bash 没有 glob 限定符,但您可以
find
报告名称不以数字结尾的目录类型文件:使用 bash4.4 或更新版本并且
find
支持-print0
:使用旧版本的 bash,您始终可以循环填充数组:
我们仅在 0123456789 上使用
LC_ALL=C
so[0-9]
匹配,而不是在其他语言环境中经常在 0 到 9 之间排序的数千个其他字符,并且还使0 或更多字符上的*
in*[0-9]
which 匹配 0 或更多字节。现在请注意,某些语言环境使用的字符编码中除了 0123456789 之外还有一些其他字符,并且编码以与 0123456789 相同的字节值结尾。例如在中国使用的 GB18030 字符集中:
不管它是如何编码的,该
¾
字符通常都会被匹配,[0-9]
因为出于明显的原因,它在 0 到 9 之间排序,而且,它的 GB18030 编码以字节 0x36 结尾,这恰好也是 ASCII 数字字符的编码6
。因此,在 C 语言环境中,由 GB18030 编码组成的文件路径
/var/kafka/¾¾¾
将被视为以 ASCII 数字结尾,并且不会报告。是否应该是另一回事。使用
find
:我正在“滥用”
grep
以获得合理的返回码,如果有人知道更好的方法,请告诉我。另一种变体:
$?
如果所有目录名称都以数字结尾,则返回 true(为 0)