Редактирование вывода fslint с помощью инструментов оболочки awk | грэп | sed

Вы не можете безопасно хранить все состояние машины внутри машины.

Но подобные действия возможны, если принять определенные ограничения. Вы можете использовать файловую систему (, например. btrfs, xfs ), который поддерживает моментальные снимки как для вашей ОС, так и для тома данных (s ). В качестве альтернативы вы можете использовать моментальные снимки LVM с любой файловой системой.

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

1
28.12.2019, 18:12
2 ответа

Я не понимаю ваш список требований, учитывая, сколько времени я готов потратить на попытки, но вот сценарий, который просто классифицирует и печатает типы файлов, которые вам интересны, и, надеюсь, вы сможете понять остальные:

$ cat tst.awk
/^#/ { prt(); print; next }
{ files[$0] }
END { prt() }

function prt(   file, isLibrary, isLabsBack, isNothing) {
    for (file in files) {
        if ( file ~ /(^|\/)Library(\/|$)/ ) {
            isLibrary[file]
        }
        else if ( file ~ /(^|\/)(labs data|backup-current)(\/|$)/ ) {
            isLabsBack[file]
        }
        else {
            isNothing[file]
        }
    }
    for (file in isLibrary) {
        print "Library", file
    }
    for (file in isLabsBack) {
        print "LabsBack", file
    }
    for (file in isNothing) {
        print "Nothing", file
    }
    delete files
}

.

$ awk -f tst.awk file
#3 x 697,612,024        (1,395,236,864) bytes wasted
LabsBack /yet/another/path/to/labs data/some/path/file_a.dat
Nothing /another/path/to/backup-disk-name/171023/file_a.dat
Nothing /path/to/backup-100425/file_a.dat
#4 x 97,874,344 (293,634,048)   bytes wasted
Library /backup-120708/Library/some/path/file b.mov
LabsBack /some/other/path/to/backup-current/file b.mov
Nothing /path/to/backup-100425/file b.mov
Nothing /another/path/to/backup-140102/file b.mov
#2 x 198,315,112        (198,316,032)   bytes wasted
Nothing /path/to/backup-100425/file_c.out
Nothing /another/path/to/backup-disk-name/171023/file_c.out
2
27.01.2020, 23:29

Вот код, который дает желаемый результат, упомянутый в вопросе, для тех, кому это интересно. Это просто крошечная адаптация действительно умного кода @Ed.

BEGIN { print "#!/bin/bash" }
/^#/ { prt(); print; next }
{ files[$0] }
END { prt() }

function prt(   file, isDate, isKeep, isDelete, backup, latest, pats) {
    # file exists in a current backup directory (yes|no)
    backup = "no"
    # latest historical backup date
    latest = "000000"
    for (file in files) {
        if ( file ~ /\/Library\// ) {
            # files to check manually
            isKeep[file]
        }
        else if ( file ~ /\/(labs data|backup-current)\// ) {
            # backup files to keep
            isKeep[file]
            backup = "yes"
        }
        else if ( match(file, /\/(backup-disk-name\/|backup-)([0-2][0-9][0-1][0-9][0-3][0-9])\//, pats) != 0 ) {
            # files in historical backup directories
            if ( pats[2] > latest ) {
                latest = pats[2]
            }
            isDate[file] = pats[2]
        }
        else {
            # unclassified files to check manually
            isKeep[file]
        }
    }
    for (file in isDate) {
        if ( isDate[file] == latest && backup == "no") {
            isKeep[file]
        }
        else {
            isDelete[file]
        }
    }
    for (file in isKeep) {
        print "#", file
    }
    for (file in isDelete) {
        # use single quotes to escape special characters in file
        # use gensub() to escape single quotes in file
        print "rm", "'" gensub(/'/,"'\\\\''", "g", file) "'"
    }
    delete files
}

Наконец, я хотел бы поделиться некоторыми мыслями. Надеюсь, я не слишком расстраиваюсь.
Несколько недель назад я решил, наконец, очистить эти чудовищные резервные данные (, некоторые файлы имеют более 10 дубликатов ). Но я не смог найти инструмент для автоматизации задачи. И я не хотел запускать для этого программу на C и не хотел идти по пути Perl. Так что я знал, что должен (и хотел )пойти по пути оболочки. Но я не знал, с чего начать, и застрял на первых строчках.

Много прочитав, я все еще был в замешательстве. Поэтому я решил опубликовать свой вопрос на SE.
Когда я впервые прочитал код @Ed, я подумал: «Какого черта!». Затем, когда я получил его, я понял, что это блестящий фрагмент кода, очень эффективный и понятный.

Итак, мы здесь. Около недели назад я ничего не знал о awkи очень мало знал о RegExp. Теперь, благодаря вкладу @Ed, я смог написать «мой» первый awkскрипт, лучше понять мир регулярных выражений и выполнить поставленную задачу. Что еще более важно, теперь я достаточно уверенно погружаюсь самостоятельно в RegExp, awkи другие инструменты оболочки обработки текста. Это также мотивирует меня вносить больший вклад в SE.
Я просто хотел поделиться своим личным опытом,и дать надежду другим, кто может, как и я, застрять в проблеме, например, лицом к лицу с горой.

0
27.01.2020, 23:29

Теги

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