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
取决于语言,使用date
cookie 可能会产生意外的结果。