我目前在 Linux 的一个目录中有 1000 个文件(据说(具有以下名称的文件夹:
Simulation.Run.1.rds
Simulation.Run.2.rds
Simulation.Run.3.rds
...
Simulation.Run.999.rds
Simulation.Run.1000.rds
有时,生成这些文件的软件往往会跳过一些文件,所以我可能会丢失,例如Simulation.Run.900.rds
.我想知道是否有一个简单的命令来验证所有 1000 个文件都在那里,并让该命令可能告诉我哪些文件可能丢失(如果有的话(。任何建议将不胜感激。谢谢!
使用 bash 您可以检查文件是否存在:
for((i=1; i<=1000; i++)); do name="Simulation.Run.${i}.rds"; [[ ! -e "$name" ]] && echo "missing $name"; done
输出(例如(:
缺少模拟.运行.900.rds 缺少模拟.运行.901.rds
请参阅:help test
以下是一些其他想法,只是为了好玩:
最简单的方法:
ls Sim* | wc -l
这只计算存在的文件数。
使用GNU Parallel:
parallel '[ -e Simulation.Run.{}.rds ] || echo {}' ::: {1..1000}
这将为每个预期的文件生成一个test
语句,如果不存在,则回显其编号。
带diff
:
diff <(printf "Simulation.Run.%d.rdsn" $(seq 1000) | sort) <(ls Sim* | sort)
这将生成一个包含预期文件名的伪文件和另一个包含实际存在的文件名的伪文件,并将两者传递给diff
。
diff
和grep
:
seq 1000 | diff - <(ls Sim* | grep -Eo "d+" | sort -n)
这将生成文件名中预期数字的列表,并将其发送给diff
,以便与从目录中实际存在的文件名中提取的数字部分列表进行比较。
awk '
BEGIN {
for (i=1; i<ARGC; i++) {
seqNr = ARGV[i]
gsub(/Simulation.Run.|.rds/,"",seqNr)
if ( seqNr != (prevSeqNr+1) ) {
printf "File %s does not immediately follow %sn", ARGV[i], ARGV[i-1] | "cat>&2"
}
prevSeqNr = seqNr
}
exit
}
' Simulation.Run.*
仅使用基本命令:
$ for I in {1..1000} ; do ls "Simulation.Run.$I.rds" ; done | grep 'No such file'