Пропущенные файлы в последовательности - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь адаптировать этот скрипт для работы с каталогом файлов .pdf.Что отличается от моей файловой структуры, так это использование ведущих нулей.Все мои файлы состоят из 3 цифр - например,

001.pdf
002.pdf
...
045.pdf
046.pdf
...
124.pdf
125.pdf

Возможно ли сделать эту работу?

#!/bin/sh
start_number=1
current_number=0
errfound=0
errfiles=""


for file in $(ls); do
    current_number="${start_number}"
    file_error=0
    while read line; do 
        if [ ! "${line}" = "${current_number}" ]; then
            echo "Missing number: ${current_number}"
            file_error=1
        fi  
    done < $file
    if [ "${file_error}" -ne 0 ]; then
        errfiles="${errfiles}${file} "
    fi
done
if [ ! -z "${errfiles}" ]; then
    echo "The following files are missing numbers:"
    echo "${errfiles}"
fi
exit 0

1 Ответ

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

Если вы хотите прочитать имена файлов из файла и сообщить о пропущенных именах в этом списке:

 awk '{ name = sprintf("%03d.pdf", ++n) }
      { while ($0 != name) {
            printf("Missing file %s\n", name)
            name = sprintf("%03d.pdf", ++n)
        } }' <file

Учитывая файл

001.pdf
002.pdf
005.pdf
007.pdf
008.pdf

Это сгенерирует

Missing file 003.pdf
Missing file 004.pdf
Missing file 006.pdf

Предполагая, что вы хотите найти отсутствующих файлов в последовательности с bash, где каждое имя файла должно соответствовать шаблону <3 zero-filled digits>.pdf и где цифры должны быть между 001 и 125:

for name in {001..125}.pdf
    if [ ! -f "$name" ]; then
        printf 'file "%s" is missing\n' "$name" >&2
    fi
done

или с /bin/sh:

i=1
while [ "$i" -le 125 ]; do
    name=$( printf '%03d.pdf' "$i" )
    if [ ! -f "$name" ]; then
        printf 'file "%s" is missing\n' "$name" >&2
    fi
    i=$(( i + 1 ))
done

Итерируется с i, принимая значения от 1 до 125. Ожидаемое имя файла создается с использованием printf и спецификации формата %03d.pdf. %03d - это заполнитель для значения, которое будет преобразовано в «десятичное целое число, заполненное нулями» (для этого значения будет использоваться $i).

Если ожидаемое имя файла не существует как обычный файл, сообщение печатается со стандартной ошибкой.

Использование ksh93:

for name in {1..125%03d}.pdf
    if [ ! -f "$name" ]; then
        printf 'file "%s" is missing\n' "$name" >&2
    fi
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...