Как изменить целое число в сценарии bash в соответствии с записанными именами файлов.dat

С нотацией GNU Sed n-skip-m:

$ sed '2~2d' file.txt
86850343
89381968
89714939
90124775
91408453
0
25.02.2021, 08:03
2 ответа

Я придумал простой пример, вычисляющий хэш SHA256 каждого файла по мере их появления в каталоге. Безвредный и легко проверить, если он ошибся. Вы можете использовать любую другую обработку.

#!/bin/sh
inotifywait -m "$@" -e create | while read dir event file; do
    if [ -f "${dir}${file}" ]; then
        sha256sum "${dir}${file}"
    fi
done

Есть несколько проблем с этим, не все из них легко решить.

  • Что делать, если в имени файла есть символы новой строки? Он будет обрабатывать их как 2 отдельных элемента, и, что еще хуже, тот, кто пишет эти файлы, может заставить скрипт работать с каким-то произвольным другим файлом. Теоретически вы могли бы использовать\0-единственный символ, который не может появляться в имени файла -в качестве разделителя, но я не смог заставить его работать с $IFSи опцией --format. Возможно, было бы лучше не использовать -m, а повторно вызывать inotifywait, чтобы вы знали, что один вывод = один файл. Но тогда вы пропустите много событий!
  • Быстрое создание и быстрое удаление файла приведет к пропуску событий. На самом деле все еще хуже. Кто-то может создать обычный файл, затем ваш скрипт выполнит [ -f ${dir}${file} ], затем он удалит его и вместо этого создаст символическую ссылку, затем ваш скрипт сделает свое дело с произвольным файлом. Так что даже если бы у меня заработала штука \0, это не имело бы значения.
  • Медленная обработка. Если обработка займет больше времени, чем создание файла, возникнет большая задержка, что значительно усугубит вышеуказанные проблемы. Это можно легко исправить с помощью хорошо расположенного&:)
  • Чтение половины -записанных файлов. Этого можно избежать, используя событие close_writeили создав файлы в другом месте и переместив их в отслеживаемый каталог, когда они будут готовы.

Я думаю, что это одна из тех задач, которые не следует выполнять в сценарии оболочки. Здесь должна быть какая-то синхронизация между читателем и писателем, и может быть или не быть граница доверия.

0
18.03.2021, 22:28

Использовать программную ссылку ln -s blabla_3300.dat.next.

Скажите вашему сценарию читать .next, затем rm.next;ln -s blabla3400.dat.next.

0
18.03.2021, 22:28

Теги

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