文件和目录名称的分隔列表

文件和目录名称的分隔列表

能否简化或使以下循环更清晰一些。我循环遍历存储在中的文件名和目录序列parg,将有效名称与无效名称分开。我还删除了重复项。 fdir包含有效条目,而fdadra分别包含有效文件和有效目录。

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

相关内容