Как удалить линию «поднятыми» в VI?

Используйте действие -exec в find, чтобы выполнить команду для каждого файла. Это выполняет программу с аргументами; если вам нужна более сложная команда (с расширением переменных, условными операторами и т. д.), вам нужно явно вызвать оболочку:

find /dir/* -type f -mtime +14 -exec sh -c '
  if …; then
    rm "$0"
  fi
' {} \;

Чтобы проверить, открыт ли в данный момент файл, наиболее простой способ - вызвать fuser .

find /dir/* -type f -mtime +14 -exec sh -c '
  if ! fuser "$0" >/dev/null 2>/dev/null; then
    rm "$0"
  fi
' {} \;

Помните, что то, что файл не изменялся в течение длительного времени и в настоящее время не открыт, не означает, что он бесполезен. Я рекомендую хотя бы проверить, что файл давно не читался; это можно проверить с помощью времени доступа, но имейте в виду, что системы Linux не обновляют время доступа надежно. (Выполняются ли они и как часто, зависит от версии ядра, от параметров монтирования и от того, как время доступа сравнивается со временем модификации.)

Я рекомендую просмотреть файлы перед их удалением.

find /dir/* -type f -mtime +14 -atime +14 -exec sh -c '
  if ! fuser "$0" >/dev/null 2>/dev/null; then
    echo "$0"
  fi
' {} \; >files-to-delete-potentially.txt

Проверьте имена файлов и удалите те, которые хотите сохранить. Затем, чтобы удалить их все, предполагая, что ни одно из имен файлов не содержит символа новой строки, вы можете использовать

4
19.07.2018, 19:42
1 ответ

Глядя на свой сценарий, вы делаете дамп и пытаетесь редактировать, искать и редактировать строки, двоичные файлы с помощью viтекстового редактора.

Таким образом, вы столкнетесь с множеством управляющих символов, которые изменят представление о строках, длине строк и, в некоторых случаях, даже, возможно, о конце -файла -.

Так как вас интересует только текст, а вы уже частично анализируете содержимое диска, я бы добавил к нему команду strings, чтобы отбрасывать не -текстовые символы.

Чтобы иметь возможность обрабатывать вывод в vi, вы можете изменить свой скрипт на:

sudo grep --binary-files=text --context=100 'unique string' /dev/sda1 | strings > recover_file

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

sudo strings /dev/sda1 | grep --context=100 'unique string' > recover_file

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

Изman strings

strings - print the strings of printable characters in files.

Description

For each file given, GNU strings prints the printable character sequences that are at least 4 characters long (or the number given with the options below) and are followed by an unprintable character. By default, it only prints the strings from the initialized and loaded sections of object files; for other types of files, it prints the strings from the whole file.

4
27.01.2020, 20:54

Теги

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