列出目录中具有模式的分组文件

list grouped files with pattern in a directory

假设我有以下 files/pattern:

我想计算一组文件有多少个:

问题是文件太多,不知道有多少pattern,不知道有没有A、B、C、D。 我怎样才能找到所有模式(并计算它们)?

您可以:

ls -1 | sed -En 's/(.*)_[0-9]+.log/_*.log/p' | uniq -c

将您的输出通过管道传输到 sed 以用星号替换数字并计算唯一条目

一种方法,使用 GNU datamash 进行计数:

find . -name "log_*.log" -print | datamash -s -t_ -g1,2 count 3 | sed 's/_\([^_]*\)$/_*.log /'

或使用awk:

find . -name "log_*.log" -print | \
 awk -F_ '{ counts["_"]++ }
          END { for (pat in counts) printf "%s_*.log %d\n", pat, counts[pat] }'

仅使用 grep。我正在使用 "here document" 但您可以通过管道输入。请注意,在下面的示例中,我们仅匹配 A.

grep -Pch '(?<=log_)A(?=_[0-9]{8}\.log)' <<-EOF
log_A_20000101.log
log_A_20200412.log
log_B_20000101.log
log_B_20200412.log
log_C_20000101.log
log_C_20200412.log
log_D_20000101.log
log_D_20200412.log
EOF

一些解释:

(?<=log_) ............. positive look-behind (just validate)
(?=_[0-9]{8}\.log) .... positive look-ahead