如何提取目录中所有丢失文件的逗号分隔索引列表?

如何提取目录中所有丢失文件的逗号分隔索引列表?

我目前有一个目录/mydir,里面应该有 1000 个表单的数据文件File1.exe, File2.exe, ... , File100.exe

我目前有一个 for 循环,可以搜索并输出丢失的文件:

for((i=1; i<=1000; i++))
do 
    name="File.${i}.exe"; [[ ! -e "$name" ]] && echo "$i" 
done

我想知道是否有任何方法可以不回显丢失的索引,而是将其放入逗号分隔的列表中,例如:

1,5,20,40,etc

有没有办法做到这一点?

答案1

只需使用,对于逗号分隔的字符串,继续将文件索引添加到变量并打印变量

for((i=1; i<=30; i++))
do
    name="File${i}.exe"; [[ ! -e "$name" ]] && files="$files$i,"
done
echo $files | sed  s/,$//

或者您可以将值存储在数组/列表中

arr=()
for((i=1; i<=30; i++))
do
    name="File${i}.exe"; [[ ! -e "$name" ]] && arr+=($i)
done
(IFS=, ; echo "${arr[*]}") #to print the array with comma as separator 

答案2

使用/bin/sh位置参数列表来存储丢失文件的名称:

set --
i=1
while [ "$i" -le 1000 ]; do
    name="File.$i.exe"
    [[ ! -e "$name" ]] && set -- "$@" "$name"
    i=$(( i + 1 ))
done

( IFS=','; printf 'Missing files: %s\n' "$*" )

或使用bash和一个数组:

missing=()
for (( i=1; i<=1000; ++i )); do
    name="File.$i.exe"
    [[ ! -e "$name" ]] && missing+=( "$name" )
done

( IFS=','; printf 'Missing files: %s\n' "${missing[*]}" )

当使用"$*"or时"${missing[*]}",数组将被转换为字符串。该字符串将与$IFS作为分隔符的第一个字符(默认为空格)连接。子 shell 设置IFS为逗号,然后打印以逗号连接的数组。子 shell 会阻止IFS在脚本的其余部分中设置变量。

该代码还能够处理包含空格等的文件名。

答案3

使用paste工具,只需添加| paste -sd,到循环中:

for((i=1; i<=1000; i++))
do 
    name="File.${i}.exe"; [[ ! -e "$name" ]] && echo "$i" 
done | paste -sd,

解释:

粘贴 - 合并文件行
粘贴 [OPTION]... [FILE]...
没有 FILE,或者当 FILE 为 - 时,读取标准输入。

  • -s:一次粘贴一个文件而不是并行粘贴
  • -d: 分隔符(,在本例中)

相关内容