两个Shell参数展开,一个接一个';t工作(Bash)

两个Shell参数展开,一个接一个';t工作(Bash),bash,Bash,使用bash4.4,我试图从当前目录中获取文件列表,将它们放入一个数组中,然后使用shell参数扩展从数组中删除路径中包含/cache/和/tmp/的文件 这是我到目前为止所做的,但它不起作用。问题似乎是第二个字符串替换发生在第一个字符串将其结果存储到第一个数组之前。因此,当执行第二个替换时,第一个数组还没有值,导致第二个数组为空。目标是获得一个文件列表,这些文件的时间戳来自昨天的日期,并且在其路径中不包含/cache/或/tmp/ #!/bin/bash FIND="$(find

使用bash4.4,我试图从当前目录中获取文件列表,将它们放入一个数组中,然后使用shell参数扩展从数组中删除路径中包含/cache/和/tmp/的文件

这是我到目前为止所做的,但它不起作用。问题似乎是第二个字符串替换发生在第一个字符串将其结果存储到第一个数组之前。因此,当执行第二个替换时,第一个数组还没有值,导致第二个数组为空。目标是获得一个文件列表,这些文件的时间戳来自昨天的日期,并且在其路径中不包含/cache/或/tmp/

#!/bin/bash

FIND="$(find . -type f -newermt $(date -d 'yesterday 13:00' '+%Y-%m-%d') ! -newermt $(date '+%Y-%m-%d'))"
readarray -t my_array <<<"$FIND"
first_array="${my_array[@]//*\/tmp\/*/}"
second_array="${first_array[@]//*\/cache\/*/}"
#/bin/bash
FIND=“$(FIND.-type f-newermt$(日期-d'昨天13:00'+%Y-%m-%d')!-newermt$(日期'+%Y-%m-%d'))

readarray-t my_array
第一个_array
不是数组;这是一个空格分隔的字符串。当分配给
第二个数组时,如果任何原始数组元素具有
tmp
cache
,则整个字符串将被删除

FIND="$(find . -type f -newermt $(date -d 'yesterday 13:00' '+%Y-%m-%d') ! -newermt $(date '+%Y-%m-%d'))"
readarray -t my_array <<<"$FIND"

# Use array assignment so that each element of my_array becomes a separate
# element of first_array
first_array=("${my_array[@]//*\/tmp\/*/}")

# Ditto for first_array -> second_array
second_array=("${first_array[@]//*\/cache\/*/}")
FIND=“$(FIND.-type f-newermt$(日期-d'昨天13:00'+%Y-%m-%d')!-newermt$(日期'+%Y-%m-%d'))

readarray-t my_array过滤掉
find
中不需要的路径,并使用find中的
null
分隔输出填充数组:


readarray-d'-t我的数组<
FIND
第一个数组
第二个数组
没有数组数据结构,它们都只是一个完整的字符串。另外,
find
还有一个选项,可以像对日期/时间求反一样对文件名中的字符串求反。请先将脚本粘贴到那里:
-newermt$(日期-d'昨天13:00'+%Y-%m-%d')
将忽略13:00的时间,因为输出格式不包括小时和分钟。@LéaGris将一天的中间时间作为时间保证“昨天”总是返回昨天的日期。如果“昨天”将日期追溯到24小时,这是很有帮助的,因为在夏时制开始后的第二天午夜,24小时前是两天前,而不是一天前。这不太合适。它将包含“/tmp/”或“/cache/”的数组项转换为空字符串,而不是删除它们。取决于阵列的使用方式,这可能是不够的。我知道。现在我需要以某种方式过滤掉空值。我会过滤掉find中的tmp和缓存路径,并使用find中的空分隔项填充数组,而不是将find的输出存储在字符串中,然后将字符串拆分为具有危险的换行符的数组。的确如此。另外,首先考虑是否需要一个数组,不能只使用<代码> -Exc>代码来执行使用数组的命令。