В Linux, с серией предположительно последовательно именованных файлов, как я могу проверить, все ли файлы действительно есть? - PullRequest
0 голосов
/ 27 мая 2018

У меня в настоящее время есть папки из 1000 файлов (предположительно) со следующими именами в каталоге в Linux:

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 файлов присутствуют, и чтобы команда могла сказать мне, какие файлы могут отсутствовать, если таковые вообще имеются.Любой совет будет принята с благодарностью.Спасибо!

Ответы [ 4 ]

0 голосов
/ 29 мая 2018

Используя только основные команды:

$ for I in {1..1000} ; do ls "Simulation.Run.$I.rds" ; done | grep 'No such file'
0 голосов
/ 27 мая 2018

Вот некоторые другие идеи, просто для удовольствия:


Самый простой метод:

ls Sim* | wc -l

Это просто подсчитывает количество имеющихся файлов.


С GNU Parallel :

parallel '[ -e Simulation.Run.{}.rds ] || echo {}' ::: {1..1000}

Это создает оператор test для каждого ожидаемого файла и отображает его номер, если он не существует.


С diff:

diff <(printf "Simulation.Run.%d.rds\n" $(seq 1000) | sort) <(ls Sim* | sort)

Создает псевдофайл, содержащий имена ожидаемых файлов, и другой псевдофайл с именами фактически присутствующих файлов и передает их в diff.


С diff и grep:

seq 1000 | diff - <(ls Sim* | grep -Eo "\d+" | sort -n)

Создает список ожидаемых чисел в именах файлов и отправляет его на diff для сравнения ссписок частей числа, извлеченных из имен файлов, которые фактически присутствуют в каталоге.

0 голосов
/ 28 мая 2018
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.*
0 голосов
/ 27 мая 2018

С помощью bash вы можете проверить, существуют ли файлы:

for((i=1; i<=1000; i++)); do name="Simulation.Run.${i}.rds"; [[ ! -e "$name" ]] && echo "missing $name"; done

Вывод (например):

missing Simulation.Run.900.rds
missing Simulation.Run.901.rds

См .: help test

...