Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linux中,对于一系列按顺序命名的文件,我如何进行检查以验证所有文件是否确实存在?_Linux_Grep_Find - Fatal编程技术网

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

在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个文件都在那里,并让命令

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

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'