Предположение, что в памяти находится весь RAW-файл, неверно.Обычно, когда файл открывается, процесс получает дескриптор файла, который можно использовать для чтения / записи файла.
Когда файл открывается процессом, а затем удаляется, пока файл еще открыт, это не означает, что файл удаляется мгновенно. Файл фактически удаляется, когда больше нет процессов с дескрипторами (дескрипторами файлов) для этого файла. Вы можете использовать lsof
, чтобы увидеть, есть ли у файла еще дескрипторы, и когда вы удаляете такой файл, он часто отображается с текстом (удален)
, добавленным к строке.
Дисковое пространство также не освобождается при удалении открытого файла, поэтому можно безопасно использовать файл, пока он открыт. Когда удаленный файл больше не имеет активных файловых дескрипторов, файловая система освободит занимаемое дисковое пространство.
В системе GNU или FreeBSD вы можете попробовать что-то вроде:
grep -rl --null '"moveLimit":[0-9]'. |
xargs -r0 perl -pi -e 's/"moveLimit":\K\d+/$& + 100/ge'
grep
r
экурсивно l
перечисляет файлы в текущем каталоге (.
), содержащие "moveLimit":
, за которыми следует десятичная цифра (null
-, разделенная дляxargs -0
)xargs -r0
передает этот список файлов вperl
perl
редактирует файлы i
n -и заменяет последовательности цифр (\d+
, которые следуют за "moveLimit":
, на тот же номер($&
)плюс 100. Если бы вы сказали в самом начале, что ваши файлы txt
на самом деле являются файлами JSON (, так как ваш образец просто выглядит как )-, это изменило бы все и предотвратило бы большинство вопросов/комментариев.
Используйте соответствующие инструменты JSON, такие как jq
, так как это было бы правильно:
for f in *.txt; do
if grep -q '"moveLimit":[0-9]*,' "$f"; then
jq -c '.moveLimit |=. + 100' "$f" > tmp_f && mv tmp_f "$f"
fi
done