在bash中,如果我有一个文件名数组,我从这样的文件中检索:
readarray files < $MY_DIR/my_file_list.cfg
如何删除数组files
中长度少于四个字符的所有元素?
答案 0 :(得分:2)
循环关于数组的每个元素并检查其元素长度并在必要时删除元素。
for ((i=0;i<=${#files[@]};i++)); do
[[ ${#files[$i]} -lt 4 ]] && unset files[$i]
done
declare -p
中的元素数量
${#files[@]}
:数组files
${#files[$i]}
:元素$i
的长度
-lt
:算术测试小于
答案 1 :(得分:1)
使用bash
子字符串扩展测试代码:
printf "abc\nabcdefg\na\nabcd\n" | while read x ; do [ "${x:4}" ] && echo $x ; done
输出:
abcdefg
abcd
因此:
纯bash
代码:
readarray files < <(while read x ; do [ "${x:4}" ] && echo $x ; done < \
$MY_DIR/my_file_list.cfg )
更简单的grep
辅助代码:
readarray files < <(grep '^....' $MY_DIR/my_file_list.cfg)
这些方法在太短的条目上不会浪费数组内存。最糟糕的情况是,如果 my_file_list.cfg 只包含一个长名称,而是包含数十亿个短名称。 (数十亿个短名称可能耗尽bash
的记忆,或至少导致交换或颠簸。)