Сценарий: система резервного копирования создает архивы rar и разделяет их на 100 МБ частей. Я хотел бы найти файлы с наибольшим номером в этом каталоге.

Например, на входе и выходе:

Входные данные:

Backup_UniqueName123_part1.rar
Backup_UniqueName123_part2.rar
Backup_UniqueName123_part3.rar
Backup_RandomName_part1.rar
Backup_RandomName_part2.rar
Backup_Server_part1.rar
Backup_Server_part2.rar

Выход:

Backup_UniqueName123_part3.rar
Backup_RandomName_part2.rar
Backup_Server_part2.rar

2 ответа2

0

Попробуй это:

DIRPATH="/where/youre/files/are"

BASE=''
NUM=0
while read F; do
  test -e "$F" || continue
  FB=$(echo "$F" | sed 's/_part[0-9]*\.rar$//')
  FN=$(echo "$F" | sed 's/.rar$// ; s/.*\([0-9][0-9]*\)$/\1/')
  if test "$BASE" == "$FB" ; then
    test $FN -gt $NUM && NUM=$FN
  else
    test -n "$BASE" && echo "${BASE}_part$NUM.rar"
    BASE=$FB
    NUM=$FN
  fi
done < <(ls -1 "$DIRPATH")

Объяснение:

  • Извлекаем базовое имя и номер из каждого имени файла
  • Мы сохраняем только наибольшее количество
  • Когда встречается новое базовое имя, мы печатаем старое базовое имя и старое старшее число
0

Вы также можете awk для обработки имен файлов:

{
    match($0, /(^.+)_part([0-9]+)\.rar/, parts);
    key = parts[1];
    new_count = parts[2];
    old_count = data[key];
    if (new_count > old_count) {
        data[key] = new_count;
    }
}

END {
    for (key in data) {
        print key, data[key];
    }
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .