Сохранить все файлы того же месяца + последний файл перед этим, удалить остальные

У меня когда-то была похожая проблема. Вы должны проверить файлfstab .

Если с вашим файлом fstabпроблем нет (все разделы и устройства настроены правильно) и вы по-прежнему получаете это сообщение об ошибке, возможно, что-то пошло не так с разметкой вашего диска ( Например, неправильная файловая система, по умолчанию для Linux используется ext4)

fstab должен выглядеть примерно так:

#                        
/dev/sdaX       /               ext4    defaults        0       1
/dev/sdaY       /mount/path        ext4    defaults        0       2

Где sdaX — это раздел, на котором установлен ваш Linux. Он должен быть смонтирован в корневом каталоге.

РЕДАКТИРОВАТЬ
Я не знаю, что означают эти UUID, поэтому попробуйте fsck -fбез указания каких-либо файловых систем, он должен проверить их все.

1
16.12.2016, 18:57
2 ответа

С помощью zsh вы можете сделать что-то вроде

# get current date (YYMM) in a variable 
crd=$(date "+%y%m")
# use a function to extract the 13 chars that make up the timestamp
dtts() REPLY=${${REPLY%%.*}: -13}
# sort file names by the timestamp in descending order, exclude the ones with the
# same YYMM as the current date and set the remaining file names as arguments
set -- *(.O+dtts^e_'[[ "${${REPLY%%.*}: -13:4}" == "$crd" ]]'_)
# remove the first item from the list (i.e. the last one before current month)
shift
# print the remaining file names
print -rl -- "$@"

Здесь используется расширение параметров и квалификаторы глобуса :
он сначала выбирает обычные файлы (.) В порядке убывания ( O ) по метке времени с помощью функции dtts , затем инвертированной e ] string ^ e _ '[["$ {$ {REPLY %%. *}: -13: 4}" == "$ crd"]]' _ отменяет выбор файлов, если метка времени совпадает с текущим годом и месяц (т.е. если выражение внутри кавычек вернет истину); shift затем удаляет первый элемент из списка (поскольку имена были отсортированы в порядке убывания, который будет последней меткой времени до текущего месяца)
Заменить print -rl на rm , если результат вас устраивает.

0
28.01.2020, 01:06

решение bash будет:

#!/bin/bash

keep=$(date '+%y%m')
rm `find. -name "name*" -and -not -name "name$keep*" | sort | head -n-1`
  • установить переменную $keep на текущий год (2 -цифру )и месяц.
  • удалить результат обратных кавычек -вложенный код, который является
    1. найти все имена файлов в текущем каталоге (и подкаталогах ), которые начинаются с «name» и не начинаются с «name$keep»
    1. сортировать результаты
    1. удалить последнюю строку

Однако я бы не стал использовать в таких случаях сценарий чистой оболочки, потому что код может очень быстро (усложниться и, следовательно, стать менее удобным для сопровождения ).

вместо этого вы можете использовать perl (или python ):

#!/usr/bin/env perl

use strict;
use warnings;
use POSIX qw(strftime);

# collect the names of all files older than current month.
# we assume that there are no files from future.
my $keep_date = strftime("%y%m", localtime);
my @files = sort grep {!/^name$keep_date/} glob "*.gz";

# the newest file from the collected files shall not be deleted
pop @files; 

# delete all collected files
map {unlink} @files;

или напрямую из командной строки:

perl -We 'use POSIX qw(strftime); my $keep_date = strftime("%y%m", localtime); my @files = sort grep {!/^name$keep/} glob "*.gz"; pop @files; map {unlink} @files;'
0
24.12.2020, 12:38

Теги

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