#!/bin/bash

# Skrypt unrm wyszukuje w archiwum określony usunięty plik lub katalog.
# Jeżeli jest ich kilka, wyświetlana jest lista posortowana według
# znacznika czasu. Użytkownik może z niej wybrać plik do odzyskania.

archivedir="$HOME/.deleted-files"
realrm="$(which rm)"
move="$(which mv)"

dest=$(pwd)

if [ ! -d $archivedir ] ; then
  echo "$0: Brak katalogu archiwum. Nie można odzyskiwać plików." >&2 ; exit 1
fi

cd $archivedir

# Jeżeli nie zostały określone argumenty, wyświetlana jest lista
# usuniętych plików.
if [ $# -eq 0 ] ; then
  echo "Zawartość archiwum usuniętych plików (posortowana według daty):"
  ls -FC | sed -e 's/\([[:digit:]][[:digit:]]\.\)\{5\}//g' \
    -e 's/^/  /' 
  exit 0
fi

# W przeciwnym wypadku użytkownik musi podać szablon nazw plików.
# Najpierw sprawdźmy, czy szablon odpowiada więcej niż
# jednemu plikowi lub katalogowi w archiwum.

matches="$(ls -d *"$1" 2> /dev/null | wc -l)"

if [ $matches -eq 0 ] ; then
  echo "Brak w archiwum plików zgodnych z szablonem \"$1\"." >&2
  exit 1
fi

if [ $matches -gt 1 ] ; then
  echo "W archiwum znajduje się więcej niż jeden plik zgodny z szablonem:"
  index=1
  for name in $(ls -td *"$1")
  do
    datetime="$(echo $name | cut -c1-14| \
      awk -F. '{ print $5"."$4" "$3":"$2":"$1 }')"
    filename="$(echo $name | cut -c16-)"
    if [ -d $name ] ; then
     filecount="$(ls $name | wc -l | sed 's/[^[:digit:]]//g')"
      echo " $index)   $filename  (liczba elementów: ${filecount}," \
           " usunięty $datetime)"
    else
      size="$(ls -sdk1 $name | awk '{print $1}')"
      echo " $index)   $filename  (wielkość ${size}Kb, usunięty $datetime)"
    fi
    index=$(( $index + 1))
  done
  echo ""
  echo -n "Która wersja pliku $1 ma być odzyskana (wyjście: '0')? [1] : "
  read desired
  if [ ! -z "$(echo $desired | sed 's/[[:digit:]]//g')" ] ; then
    echo "$0: Odzyskiwanie przerwane z powodu błędnych danych." >&2
    exit 1
  fi

  if [ ${desired:=1} -ge $index ] ; then
    echo "$0: Odzyskiwanie przerwane. Zbyt duży indeks pliku." >&2
    exit 1
  fi

  if [ $desired -lt 1 ] ; then
    echo "$0: Odzyskiwanie przerwane przez użytkownika." >&2 ; exit 1
  fi

  restore="$(ls -td1 *"$1" | sed -n "${desired}p")"
  
  if [ -e "$dest/$1" ] ; then
    echo "Plik \"$1\" już istnieje w tym katalogu. Odzyskanie niemożliwe." >&2
    exit 1
  fi

  echo -n "Odzyskiwanie pliku \"$1\" ..."
  $move "$restore" "$dest/$1"
  echo "zakończone."

  echo -n "Czy chcesz usunąć inne kopie tego pliku? [t] " 
  read answer
  
  if [ ${answer:=t} = "t" ] ; then
    $realrm -rf *"$1"
    echo "Kopie usunięte."
  else
    echo "Kopie zachowane."
  fi
else
  if [ -e "$dest/$1" ] ; then
    echo "Plik \"$1\" już istnieje w tym katalogu. Odzyskanie niemożliwe." >&2
    exit 1
  fi

  restore="$(ls -d *"$1")"

  echo -n "Odzyskiwanie pliku \"$1\" ... " 
  $move "$restore" "$dest/$1"
  echo "zakończone."
fi

exit 0
