Как узнать, отсутствует ли в файле с последовательным номером какой-либо файл?

Я знаю, что это старый пост, но недавно у меня была та же проблема, которая была исправлена ​​​​следуя довольно конкретной ошибке, которую мне сообщили:

lxc-create: my-container: conf.c: suggest_default_idmap: 4738 You must either run as root, or define uid mappings
lxc-create: my-container: conf.c: suggest_default_idmap: 4739 To pass uid mappings to lxc-create, you could create
lxc-create: my-container: conf.c: suggest_default_idmap: 4740 ~/.config/lxc/default.conf:
lxc-create: my-container: conf.c: suggest_default_idmap: 4741 lxc.include = /etc/lxc/default.conf
lxc-create: my-container: conf.c: suggest_default_idmap: 4742 lxc.idmap = u 0 100000 65536
lxc-create: my-container: conf.c: suggest_default_idmap: 4743 lxc.idmap = g 0 100000 65536
lxc-create: my-container: lxccontainer.c: do_lxcapi_create: 1869 Failed to create (none) storage for my-container
lxc-create: my-container: tools/lxc_create.c: main: 327 Failed to create container my-container

Это было довольно легко исправить:

mkdir -p ~/.config/lxc
touch ~/.config/lxc/default.conf
echo "lxc.include = /etc/lxc/default.conf" >> ~/.config/lxc/default.conf
echo "lxc.idmap = u 0 100000 65536" >> ~/.config/lxc/default.conf
echo "lxc.idmap = g 0 100000 65536" >> ~/.config/lxc/default.conf

Не забудьте обновить идентификаторы пользователей и групп

Кроме того, примечание, если вы получаете сообщение об ошибке:

Setting up the GPG keyring
ERROR: Unable to fetch GPG key from keyserver

Вот из-за этого:https://github.com/lxc/lxc/issues/3068

Чтобы это исправить, просто добавьте -- --keyserver hkp://p80.pool.sks-keyservers.net:80в конец команды создания, например.

lxc-create -t download -n my-container -- --keyserver hkp://p80.pool.sks-keyservers.net:80

Надеюсь, это поможет другим, по крайней мере, вам не помогло

5
13.10.2021, 07:53
3 ответа

Если вы используете оболочку bash, вы можете использовать seqили jotдля создания «идеального» выходного эталонного образца, а затем сравнить вывод ls -1с этим эталоном:

$ diff <(ls -1) <(seq -f 'file_%04g.jpeg' 999)

Это не только покажет вам все отсутствующие файлы, но и найдет посторонние файлы.

12
13.10.2021, 16:34

В то время как другие ответы предоставляют способы точно определить , какие файлы отсутствуют, первоначальный вопрос о том, отсутствует ли какой-либо файл, можно проверить в более удобном -удобном для ввода виде. способ.

Ваш список является результатом ls -1, поэтому передача его в wc должна дать вам количество файлов, совпадающих с именем последней записи.

ls -1 | wc -l

Если число не соответствует имени последнего файла, значит, файл отсутствует.

12
13.10.2021, 22:28

(Оказывается, этот вопрос был дубликатом,и то, что я использую, совпадает с верхним ответом на Как напечатать имя отсутствующих файлов в папке?)


Для интерактивного использования в bash , быстрого и легкого ввода и запоминания:
Обычно я использую раскрывающуюся скобку {01..99}для создания ожидаемого ряда и ищу lsошибки :

.
ls file_0{001..999}.jpeg > /dev/null

Перенаправление скрывает стандартный вывод списка существующих файлов, но стандартный вывод остается подключенным к терминалу. Иногда я пропускаю >/dev/nullи просто прокручиваю назад в терминале, если файлов меньше ~100, потому что сообщения об ошибках появляются первыми, в то время как lsвсе еще читает свои аргументы перед сортировкой и печатью. Это также подтверждает, что я набрал его правильно, и мой шаблон — это , соответствующий файлам, которые я действительно хотел (, особенно если он включает в себя glob ).

Для передачи/захвата вы можете foo=$(ls... 2>&1 >/dev/null)перенаправить stderr в конвейер, а затем перенаправить stdout в /dev/null, оставив stderr в конвейере оболочки. Это было бы полезно для проверки пустого/не пустого -вывода ошибок. Но в скрипте, если вы хотите получить имена отсутствующих файлов, посмотрите другие ответы вместо того, чтобы пытаться анализировать их из lsсообщений об ошибках, которые могут быть интернационализированы и т. д.

Если вы хотите/если необходимо, вы можете использовать кавычки в других частях имени файла, например 'foo bar '{01..22}.jpg. Или даже foo\ bar\ {01..22}*.jpgдля расширения до 'foo bar '01*.jpg/ 'foo bar '02*.jpgи т. д., поэтому он работает, даже если где-то есть какое-то дополнительное уникальное имя для некоторых или всех файлов, кроме порядковых номеров.

Это работает, даже если ваша нумерация не использует ведущие нули, например. {1..99}вместо {01..99}. Если вы хотите включить начальные нули в диапазон фигурных скобок, вы можете сделать что-то вроде {01..09}, что работает так, как вы надеетесь, вместо того, чтобы выносить их из выражения фигурной скобки, как я сделал в примере.


Обратите внимание, что современные системы Linux поддерживают очень длинные списки аргументов, например, 128 КБ текста .Этот метод зависит от создания командной строки с каждым файлом в ней. Это на 100% подходит для интерактивного использования :, в редких случаях, когда список слишком велик, оболочка сообщит вам об этом.

В другом ответе использовался forцикл по списку, который будет медленнее (запускать отдельный lsдля каждого файла ), но безопасен даже в огромной или более ограниченной системе с большим количеством файлов. меньшие пределы argv.

2
16.10.2021, 01:58

Теги

Похожие вопросы