我目前有一个目录/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
: 分隔符(,
在本例中)