Laboratorium 6
Skrypty Bash — tworzenie kopii zapasowych
Celem dzisiejszych zajęć jest napisanie skryptu, który wykona kopię zapasową całego katalogu /home
użytkownika do pliku user_home_data_backup.tar.gz
i zapisze go w katalogu /tmp/backup
. Jeśli ktoś wie, jak to zrobić, może przystąpić do pracy. Jeśli nie, podczas zajęć omówimy wszystkie elementy składowe takiego skryptu, a Waszym zadaniem będzie złożenie ich w całość.
Pakowanie katalogu za pomocą tar
Wykorzystamy program tar
, którego nazwa pochodzi od Tape Archiver. Początkowo służył do archiwizowania plików na taśmach magnetycznych. Obecnie tar
jest używany do pakowania wielu plików w jedno archiwum, z opcjonalną kompresją.
Składnia:
1
tar [opcje] ścieżka_docelowa źródło
Samo wywołanie polecenia tar
bez opcji nie przyniesie oczekiwanego efektu i wyświetli informacje o dostępnych opcjach. Najczęściej używane opcje to:
-f
— określa nazwę pliku archiwum-c
— tworzy nowe archiwum-x
— rozpakowuje archiwum-v
— wyświetla szczegółowe informacje o przetwarzanych plikach (tryb verbose)-z
— kompresuje lub dekompresuje archiwum za pomocągzip
, tworząc plik w formacie.tar.gz
-t
— wyświetla zawartość archiwum
Przykładowe użycie:
Tworzenie archiwum i kompresja:
1
tar -cvzf archiwum.tar.gz /ścieżka/do/katalogu
Rozpakowywanie archiwum:
1
tar -xvzf archiwum.tar.gz
Pobieranie nazwy użytkownika
Aby pobrać nazwę bieżącego użytkownika, możemy użyć polecenia:
1
whoami
Aby przypisać nazwę użytkownika do zmiennej w skrypcie, używamy:
1
user=$(whoami)
Jeśli chcemy utworzyć plik o nazwie zawierającej nazwę użytkownika, możemy użyć zmiennej:
1
touch "${user}_plik.txt"
Użycie nawiasów klamrowych ${user}
pozwala na prawidłowe wstawienie wartości zmiennej w ciąg znaków bez ryzyka błędnej interpretacji przez powłokę.
Dodawanie daty do nazwy pliku
Chcąc dołączyć datę do nazwy pliku, skorzystamy z polecenia date
. Polecenie to służy do wyświetlania lub ustawiania daty i czasu systemowego.
Formatowanie daty:
1
date +FORMAT
Gdzie FORMAT
to ciąg znaków zawierający specyfikatory formatu.
Najczęściej używane specyfikatory:
%Y
— rok (czterocyfrowy)%m
— miesiąc (dwucyfrowy)%d
— dzień miesiąca (dwucyfrowy)%H
— godzina (24-godzinny format)%M
— minuty%S
— sekundy
Przykład pobrania bieżącej daty w formacie YYYY-MM-DD
:
1
data=$(date +%Y-%m-%d)
Możemy teraz użyć zmiennej data
w nazwie pliku:
1
plik="${user}_home_${data}.tar.gz"
Przekierowywanie wyjścia do /dev/null
W systemach Linux istnieje specjalny plik urządzenia o nazwie /dev/null
, który jest “czarną dziurą” — wszystko, co zostanie do niego przekierowane, zostanie odrzucone.
Przekierowanie standardowego wyjścia błędów (STDERR) do /dev/null
:
1
polecenie 2> /dev/null
Dzięki temu możemy ukryć komunikaty błędów generowane przez polecenie.
Skrypt końcowy
Zadanie polega na napisaniu skryptu, który utworzy kopię zapasową katalogu domowego użytkownika i zapisze ją w katalogu /tmp/backup
pod nazwą zawierającą nazwę użytkownika oraz bieżącą datę.
Opis skryptu:
- Sprawdzamy, czy katalog
/tmp/backup
istnieje; jeśli nie, tworzymy go za pomocąmkdir -p
. - Pobieramy nazwę użytkownika za pomocą
whoami
i przypisujemy ją do zmiennejuser
. - Pobieramy bieżącą datę w formacie
YYYY-MM-DD
i przypisujemy do zmiennejdata
. - Definiujemy ścieżkę do pliku archiwum, wykorzystując zmienne
user
idata
. - Tworzymy archiwum za pomocą
tar
, przekierowując komunikaty błędów do/dev/null
. - Sprawdzamy, czy plik archiwum został utworzony, i informujemy użytkownika o wyniku operacji.
Uwagi:
- Upewnij się, że masz odpowiednie uprawnienia do odczytu katalogu
/home/$user
oraz zapisu w katalogu/tmp/backup
. - Jeśli chcesz zarchiwizować cały katalog
/home
, zastąp/home/$user
ścieżką/home
w poleceniutar
.
Dodatkowe informacje
Formatowanie daty i czasu
Możemy dostosować format daty i czasu według własnych potrzeb, łącząc różne specyfikatory. Na przykład:
Bieżąca data i czas w formacie
YYYY-MM-DD_HH-MM-SS
:1
data=$(date +%Y-%m-%d_%H-%M-%S)
Użycie nazwy miesiąca i dnia tygodnia:
1
data=$(date +%Y-%B-%d_%A)
Przekierowywanie wyjścia i błędów
Przekierowanie zarówno standardowego wyjścia (STDOUT), jak i błędów (STDERR) do
/dev/null
:1
polecenie > /dev/null 2>&1
Użycie zmiennych w nazwach plików
Korzystanie z nawiasów klamrowych ${zmienna}
jest dobrą praktyką, szczególnie gdy zmienna jest częścią większego ciągu znaków.
Przykład:
1
plik="${user}_plik.txt"