for 循环中的 ls 命令

for 循环中的 ls 命令
path=/2020/01-Jan/00:00/sb/*.txt

在 01-Jan 下,我有很多文件夹,例如

00:00 
01:00 
02:00 
03:00 
.. 
23:00

(每个xx:00文件夹都有/sb/*.txt)。我想获取 00:00 到 03:00 范围内的 .txt 文件。我试过了

for ((i=$(ls /2020/01-Jan/00:00/sb/*.txt); i<=$(ls /2020/01-Jan/03:00/sb/*.txt); i++))
do
  ls *.txt
done

但它正在给予

syntax error : arithmetic expression required

你能帮忙解决这个问题吗?

答案1

我不确定我是否正确,但你可以简单地做

ls 2020/01-Jan/{00..03}:00/sb/*.txt

以获得所需的输出。

答案2

使用 extglob 匹配 HH:MM 格式:

$ shopt -s extglob failglob; \
  ls 2020/01-Jan/?([01][0-9]|2[0-3]):[0-5][0-9]/*/sb/*.txt

这将仅限于最大参数(bash:/bin/ls:参数列表太长)。

在 for 循环中使用 extglob:

$ shopt -s extglob nullglob; \
  for i in 2020/01-Jan/?([01][0-9]|2[0-3]):[0-5][0-9]/*/sb/*.txt; do echo "$i"; done

列出两个日期之间的目录,精度为日、小时或分钟:

#!/bin/bash

# Let's create some directories.
# $ for i in 2020/01-Jan/{00..03}\:{00..59}/{0..30}/sb \
#   2020/{02..03}-Jan/00:00/0/sb ; do mkdir -p $i; touch $i/$RANDOM.txt; done

shopt -s extglob nullglob

func(){
    local -n ref=$1
    local b
    local c
    local d=$(( $(date -d "$4" +%s) - $(date +%s) ))
    local e=$((($(date -d "$3" +%s) - \
                $(date -d "$2" +%s)) / $d))
    for ((b=0; b<=$e; b++)); do
        ref+=($(date -d "$2 +$b $4" +"$5"))
    done
}

list=()

# Between two dates divided in days.
func list "01-Jan 2020" "2-Jan 2020" day "%Y/%d-%b/00:00/0/sb/*.txt"

# Between two dates divided in hours.
func list "00:00 01-Jan 2020" "02:00 01-Jan 2020" hour "%Y/%d-%b/%H:00/0/sb/*.txt"

# divided in minutes with exglob match.
func list "02:00 01-Jan 2020" "02:02 01-Jan 2020" minutes "%Y/%d-%b/%H:%M/?([0-9]|1[0-9]|20)/sb/*.txt"

# Lets show it.
for i in "${list[@]}"; do echo "$i"; done

请记住,这date取决于语言,使用datecookie 可能会产生意外的结果。

相关内容