Archiwizacja i wyszukiwanie

Archiwizacja

Oprócz klasycznych narzędzi serwerowych do archiwizacji i kompresji, tj. tar, gzip, bzip2, oraz bardziej znanych z systemów desktopowych, czyli zip, 7z oraz rar, w ostatnich latach opracowano narzędzia xz, zstd, brotli. W internecie można znaleźć wiele porównań narzędzi do kompresji, przykładowo:

Wyszukiwanie plików

find jest narzędziem pozwalających znaleźć pliki spełniające określone kryteria, a następnie wykonać na nich dowolne operacje. Wywołanie polecenia find można podzielić na dwie części:

find <katalog> <wyrażenie>

<katalog> określa gdzie zacząć wyszukiwanie. <wyrażenie> określa warunki jakie muszą spełnić pliki oraz operacje jakie będą wykonane, jeśli warunki są spełnione. Wyrażenia warunkowe mogą dotyczyć nazwy pliku, pełnej ścieżki pliku, typu pliku, rozmiaru pliku, uprawnień, właściciela, itd. Pełna lista jest dostępna w podręczniku systemowym find(1)

Jeśli podamy wiele warunków, to wszystkie muszą być spełnione. Warunki są ewaluowane od lewej do prawej. Możemy również łączyć warunki alternatywą logiczną używając operatora -or. Warunki mogą być grupowane nawiasami zwykłymi. Warunek może być zanegowany operatorem -not.

Operacje jaką mogą być wykonane na plikach możemy podzielić na:

  • wypisanie ścieżek lub informacji o plikach: -print, -print0, -ls,
  • usunięcie pliku: -delete,
  • wywołanie polecenia: -exec, -execdir, -ok, -okdir.

Każda operacja jest też warunkiem! Możemy użyć statusu polecenia wywołanego opcją -exec do zdefiniowania własnego warunku, patrz poniżej przykład z poleceniem grep.

Zachowanie -exec oraz -execdir

find wywołany bez argumentów zachowuje się tak samo jako find wywołany z argumentami:

find . -print

zatem wyświetla względne ścieżki do wszystkich plików (w tym katalogów!) leżących poniżej bieżącego katalogu. Porównaj wywołanie tree oraz find w tym samym katalogu:

.
├── katalog1
│   ├── plik1.txt
│   ├── plik2.txt
│   └── plik3.txt
├── katalog2
│   ├── plik1.txt
│   ├── plik2.txt
│   └── plik3.txt
└── skrypt.sh

2 directories, 7 files
.
./katalog1
./katalog1/plik1.txt
./katalog1/plik3.txt
./katalog1/plik2.txt
./katalog2
./katalog2/plik1.txt
./katalog2/plik3.txt
./katalog2/plik2.txt
./skrypt.sh

Do porównania działania różnych trybów wywołania -exec oraz -execdir użyjemy skryptu skrypt.sh o zawartości:

#!/bin/bash
echo "katalog: $PWD, argumenty: $@"

Skrypt wyświetli ścieżkę do katalogu, w którym został wykonany oraz wszystkie argumenty, które mu podano.

Konstrukcja -exec <polecenie> '{}' \; wywoła podane polecenie z tego samego katalogu

Przykłady

bzip2

bzip2 w przeciwieństwie do gzip nie posiada opcji -r kompresującej rekursywnie wszystkie pliki w podanym katalogu. Wywołaj find z odpowiednimi parametrami i skompresował wszystkie pliki w podanym katalogu. To znaczy, zamienił strukturę:

katalog1
├── plik1.txt
├── plik2.txt
└── plik3.txt

0 directories, 3 files

na

katalog1
├── plik1.txt.bz2
├── plik2.txt.bz2
└── plik3.txt.bz2

0 directories, 3 files
katalog=~/DYDAKTYKA/WSUNIX/wyszukiwanie
find "$katalog" -exec bzip2 '{}' \;

*.rc

Wyszukaj wszystkie pliki w katalogu /etc/, które kończą się ciągiem znaków .rc i przekopiuj je do katalogu $HOME/pliki_rc. Utwórz wcześniej katalog $HOME/pliki_rc.

mkdir ~/pliki_rc
find /etc/ -type f -iname '*.rc' -exec cp '{}' ~/pliki_rc \;

grep

Wyszukaj wszystkie pliki w katalogu /etc/, które zawierają twoją nazwę użytkownika i przekopiuj je do katalogu $HOME/pliki_o_mnie. Utwórz wcześniej katalog $HOME/pliki_o_mnie.

mkdir ~/pliki_o_mnie
find /etc/ -type f -exec grep -q NAZWA '{}' \; -exec cp '{}' ~/pliki_o_mnie \;

data modyfikacji i negacja logiczna

Znajdź wszystkie pliki w swoim katalogu domowym, które były modyfikowane przed ostatnią datą modyfikacji pliku /etc/passwd. Wymagane użycie negacji logicznej.

find ~ -not -newer /etc/passwd