Nowe posty

Autor Wątek: [bash] porownanie nazw z data  (Przeczytany 2153 razy)

patrykxes

  • Gość
[bash] porownanie nazw z data
« dnia: 2009-08-19, 08:21:57 »
Witam,
Posiadam wypisana liste nazw plikow (lista nazw plikow bedzie sie zmieniala) w nazwie jest data i godzina:
41_1_20090818_1134.tar.gz
41_1_20090819_0639.tar.gz
41_2_20090818_1133.tar.gz
41_2_20090819_0637.tar.gz
41_3_20090818_1133.tar.gz
41_3_20090819_0638.tar.gz

Jak usunac tylko te pliki, ktore sa starsze ?

np. tu wiemy, ze starszy jest plik o nazwie 41_1_20090818_1134.tar.gz i mozna usunac
41_1_20090818_1134.tar.gz
41_1_20090819_0639.tar.gz

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
[bash] porownanie nazw z data
« Odpowiedź #1 dnia: 2009-08-19, 13:00:27 »
Jeśli pliki mają takie "ładne" nazwy jak poniżej, to nie trzeba kombinować z datą. Wystarczy zwykły alfabetyczny sort.

Sortujemy od końca. Po kolei przeglądamy pliki. Plik z prefiksem (np. "41_1_") który jeszcze nie wystąpił zostawiamy. Gdy prefix się powtarza, to usuwamy. I tak do końca listy.

Czyli coś takiego:
#!/bin/bash
prefix=""
regexp="^([0-9]+_[0-9]+_)[0-9]{8}_[0-9]{4}\\.tar\\.gz$"
while read plik; do
  if [[ "$plik" =~ $regexp ]]; then
    if [ "${BASH_REMATCH[1]}" != "$prefix" ]; then
      prefix="${BASH_REMATCH[1]}"
    else
      rm "$plik"
    fi
  fi
done < <( ls -1 | sort -r )
exit 0