在Linux中,对于一系列按顺序命名的文件,我如何进行检查以验证所有文件是否确实存在?
我目前在Linux的一个目录中有1000个文件的文件夹(大概是这样的),它们的名称如下:在Linux中,对于一系列按顺序命名的文件,我如何进行检查以验证所有文件是否确实存在?,linux,grep,find,Linux,Grep,Find,我目前在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个文件都在那里,并让命令
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
for((i=1;i以下是一些其他想法,只是为了好玩:
最简单的方法:
ls Sim* | wc -l
这只是计算存在的文件数
与GNU并行时:
parallel '[ -e Simulation.Run.{}.rds ] || echo {}' ::: {1..1000}
这将为每个预期的文件生成一个test
语句,如果不存在,则回显其编号
使用diff
:
diff <(printf "Simulation.Run.%d.rds\n" $(seq 1000) | sort) <(ls Sim* | sort)
这将生成文件名中预期数字的列表,并将其发送到diff
,以与从目录中实际存在的文件名中提取的数字部分列表进行比较。awk'
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 %s\n", ARGV[i], ARGV[i-1] | "cat>&2"
}
prevSeqNr = seqNr
}
exit
}
' Simulation.Run.*
开始{
对于(i=1;i,仅使用基本命令:
$ for I in {1..1000} ; do ls "Simulation.Run.$I.rds" ; done | grep 'No such file'
这里有一个想法:使用大括号扩展创建所有1000个名称并将其放入一个文件中..将ls-v
的结果保存到一个文件中,并在这两个文件上使用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 %s\n", 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'