我有一个数组,其中包含不同目录级别中的文件路径列表。我希望将该数组过滤为仅文件,这意味着那些以/结尾的文件应该保留在数组中。在我的文件系统中,所有路径都不是真正的路径,我可以使用操作系统工具检查目录/文件的类型。
我有一个包含以下字符串的数组:
file-a
dir/
dir/file-b
dir/dir-2/
dir/dir-2/file-c并希望将其过滤为以下字符串(无目录):
file-a
dir/file-b
dir/dir-2/file-c我尝试使用以下方法,但这会删除包括/在内的所有路径,导致file-a成为唯一剩余的路径。
FILES_ARRAY=( ${FILES_ARRAY[@]//*\/} )我尝试添加一个$ (在正则表达式语法中很常见)来表示结尾,它不会从数组中删除任何内容。
FILES_ARRAY=( ${FILES_ARRAY[@]//*\$/} )发布于 2020-09-20 23:11:25
两种不同的解决方案,具体取决于filter的含义:
1-从阵列中删除目录条目:
declare -a FILES_ARRAY=([0]="file-a" [1]="dir/" [2]="dir/file-b" [3]="dir/dir-2/" [4]="dir/dir-2/file-c")
echo "++++++++++++++ array - before"
printf "%s\n" ${FILES_ARRAY[@]}
for i in ${!FILES_ARRAY[@]}
do
[[ "${FILES_ARRAY[${i}]}" == */ ]] && unset FILES_ARRAY[${i}] # remove directory from array
done
echo "++++++++++++++ array - after"
printf "%s\n" ${FILES_ARRAY[@]}这将生成:
++++++++++++++ array - before
file-a
dir/
dir/file-b
dir/dir-2/
dir/dir-2/file-c
++++++++++++++ array - after
file-a
dir/file-b
dir/dir-2/file-c2-将目录条目保留在数组中,但不显示它们;我们可以通过更改for循环的主体来重用上面的代码:
declare -a FILES_ARRAY=([0]="file-a" [1]="dir/" [2]="dir/file-b" [3]="dir/dir-2/" [4]="dir/dir-2/file-c")
echo "++++++++++++++ array"
printf "%s\n" ${FILES_ARRAY[@]}
echo "++++++++++++++ display"
for i in ${!FILES_ARRAY[@]}
do
[[ "${FILES_ARRAY[${i}]}" != */ ]] && echo "${FILES_ARRAY[${i}]}" # only display non-directory entries
done这还会生成:
++++++++++++++ array
file-a
dir/
dir/file-b
dir/dir-2/
dir/dir-2/file-c
++++++++++++++ display
file-a
dir/file-b
dir/dir-2/file-c发布于 2020-09-20 20:40:02
您可以使用
FILES_ARRAY=(file-a dir/ dir/file-b dir/dir-2/ dir/dir-2/file-c)
NEW_FILES_ARRAY=()
for (( i=0; i<${#FILES_ARRAY[@]}; i++ )); do
if ! [[ "${FILES_ARRAY[$i]}" == */ ]]; then
NEW_FILES_ARRAY+=("${FILES_ARRAY[$i]}");
fi
done
FILES_ARRAY=("${NEW_FILES_ARRAY[@]}")
printf '%s\n' ${FILES_ARRAY[@]}输出:
file-a
dir/file-b
dir/dir-2/file-c请参见online Bash demo。
NOTES
for (( i=0; i<${#FILES_ARRAY[@]}; i++ )); do ... done遍历代码长度,为FILES_ARRAY分配数组的索引andNEW_FILES_ARRAY+=("${FILES_ARRAY[$i]}");检查当前元素是否未以/结尾(*匹配任意数量的字符,/匹配/,全局模式总是需要整个字符串匹配,不需要代码) array.FILES_ARRAY=("${NEW_FILES_ARRAY[@]}")将当前项添加到NEW_FILES_ARRAY NEW_FILES_ARRAY重新分配原始变量,以便它保存过滤后的元素<代码>F226
发布于 2020-09-21 15:29:39
此awk命令可能会有所帮助,但由于路径中有空格,因此它将失败
new_arr=($(awk '{for (i=1; i<=NF; i++) if ($i !~ /\/$/) {print $i}}' <<< "${arr[@]}"))https://stackoverflow.com/questions/63978961
复制相似问题