Bash如何查找特定名称格式的文件并将其赋值为变量?
解决方案
方案1:关联数组存储(推荐)
数组可以动态适配同类型文件的数量,不需要提前定义变量名,兼容性和可维护性更好。
TARGET_DIR="/test" # 声明关联数组存储不同类型的文件列表 declare -A type_file_list # 匹配规则:前缀数字_6位日期_类型.后缀,可根据实际规则调整 for file in "$TARGET_DIR"/[0-9]*_[0-9][0-9][0-9][0-9][0-9][0-9]_*.*; do # 跳过空匹配,避免目录无符合文件时报错 [ -e "$file" ] || continue filename=$(basename "$file") # 提取类型字段(第三个下划线分隔的片段,去掉后缀) file_type=$(echo "$filename" | cut -d'_' -f3 | cut -d'.' -f1) # 按日期升序追加到对应类型的列表中 type_file_list[$file_type]+="$file " done
使用示例:
# 遍历TypeOne的所有文件 for f in ${type_file_list[TypeOne]}; do echo "处理文件:$f" done # 直接取指定位置的文件(下标从0开始) typeone_first_file=${type_file_list[TypeOne]%% *} # 第一个文件 typeone_second_file=$(echo ${type_file_list[TypeOne]} | cut -d' ' -f2) # 第二个文件
方案2:生成指定格式的命名变量
如果需要你示例中的TypeOneA、TypeTwoB这类固定格式的变量,可以用动态变量赋值实现:
TARGET_DIR="/test" # 定义字母序列,最多支持26个同类型文件,可按需扩展 letters=({A..Z}) # 动态提取所有符合规则的文件类型,不需要手动指定TypeOne/TypeTwo all_types=($(ls "$TARGET_DIR"/[0-9]*_[0-9][0-9][0-9][0-9][0-9][0-9]_*.* 2>/dev/null | cut -d'_' -f3 | cut -d'.' -f1 | sort | uniq)) for type in "${all_types[@]}"; do # 筛选该类型的所有文件,按日期升序排序 sorted_files=($(ls "$TARGET_DIR"/[0-9]*_[0-9][0-9][0-9][0-9][0-9][0-9]_${type}.* 2>/dev/null | sort -t'_' -k2)) # 遍历赋值给对应变量 for idx in "${!sorted_files[@]}"; do # 如果只需要纯文件名不需要路径,把${sorted_files[$idx]}换成$(basename ${sorted_files[$idx]}) declare "${type}${letters[$idx]}"="${sorted_files[$idx]}" done done
验证效果:
echo $TypeOneA # 输出TypeOne类型最早日期的文件 echo $TypeTwoB # 输出TypeTwo类型第二早日期的文件
规则调整说明:如果文件名前缀的数字有固定范围,把
[0-9]*改成对应匹配规则即可,比如[1-5]*就是匹配1到5开头的文件;如果日期位数不是6位,对应调整[0-9][0-9]的段数即可。
内容的提问来源于stack exchange,提问作者creamEarlGrey
相关产品推荐
相关产品推荐

