在 Linux 中,对于一系列据称按顺序命名的文件,我如何进行检查以验证所有文件是否确实存在?



我目前在 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


diffgrep

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'

最新更新