能否简化或使以下循环更清晰一些。我循环遍历存储在中的文件名和目录序列parg
,将有效名称与无效名称分开。我还删除了重复项。 fdir
包含有效条目,而fda
和dra
分别包含有效文件和有效目录。
declare -A tag # Prescribe an Associative Array
for fda in "${parg[@]}"; do
[[ -f "$fda" ]] || [[ -d "$fda" ]] || continue # Invalid Entry
[[ ${tag[comint:${fda}]+E} ]] && continue # Existing Entry
tag[comint:${fda}]=1
fdir+=( "$fda" )
[[ -f "$fda" ]] && fla+=( "$fda" )
[[ -d "$fda" ]] && dra+=( "$fda" )
done
答案1
重新表述你的问题:
我有文件名和目录名(其中一些是重复的,还有一些不存在) 作为数组中的元素存储(
original
)... 在bash
,我如何测试和处理数组中的元素original
到一个新数组中refined
,不包括重复和不存在的文件名/目录名...并同时创建两个新数组files
(仅包含精炼文件名) 和directories
(仅包含精炼目录名称)?
问题复现:
# Create some test files
$ touch file{1..3}
# Create some test directories
$ mkdir dir{1..3}
# List current working directory contents
$ printf '%s\n' *
dir1
dir2
dir3
file1
file2
file3
# Add contents to an array
$ for i in *
do
original+=( "$i" )
done
# Add contents to the same array again to generate duplicates
$ for i in *
do
original+=( "$i" )
done
# Add some invalid entries
$ original+=( "file4" "dir4" "file5" "dir5" )
# Print the array
$ printf '%s\n' "${original[@]}"
dir1
dir2
dir3
file1
file2
file3
dir1
dir2
dir3
file1
file2
file3
file4
dir4
file5
dir5
可能的解决方案:
# Test, refine and classify array items
$ for i in "${original[@]}"
do
if [[ ! "${refined[*]}" =~ "$i" ]]
then
[ -f "$i" ] && refined+=( "$i" ) && files+=( "$i" )
[ -d "$i" ] && refined+=( "$i" ) && directories+=( "$i" )
fi
done
# Print the "refined" array
$ printf '%s\n' "${refined[@]}"
dir1
dir2
dir3
file1
file2
file3
# Print the "files" array
$ printf '%s\n' "${files[@]}"
file1
file2
file3
# Print the "directories" array
$ printf '%s\n' "${directories[@]}"
dir1
dir2
dir3