/ / Sprawdź modyfikacje katalogu za pomocą diff - bash, if-statement, diff

Sprawdź modyfikacje katalogu używając diff - bash, if-statement, diff

Zaczynam od skryptowania bash i jestemaktualnie pisze skrypt do tworzenia kopii zapasowej katalogu, jeśli katalog został zmodyfikowany od czasu ostatniej kopii zapasowej. Używam polecenia diff do sprawdzenia tego, ale myślę, że może nie używam go poprawnie.

EDYTOWAĆ Powodem, dla którego dostaję różnice jest to, żepliki newFile i oldFile są tworzone w katalogu, który ma skrypt i jest to ten sam katalog, który próbuję wykonać. Jak używać diff tak, aby zwracał różnice inne niż te 2 pliki?

ls -lR $1 > oldFile

while [ 0 ];
do

ls -lR $1 > newFile

if [ ! diff newFile oldFile ] ; then
echo "they differ"

else

echo "they don"t differ"
fi

done

Odpowiedzi:

1 dla odpowiedzi № 1

Po pierwsze, instrukcja if nie działa w ogóle.

if [ diff oldFile newFile ] ; then
echo "they differ"
fi

Zanotuj [ ] nawiasy! (zauważ, że nie są to "nawiasy". [ jest shorty dla test polecenie i ] jest ostatnim argumentem. Szalony, ale fajny!


Możesz użyć

diff -rN OLD_DIR NEW_DIR

aby uzyskać różnicę rekursywną. -N także śledzi nowe pliki

Możesz również rzucić okiem inotifywait i przyjaciele. Inotify to mechanizm w jądrze Linuksa, który pozwala rejestrować przechwyty, gdy zmieni się i-węzeł (plik lub katalog ...). Za pomocą inotifywait (i fanatyków) jesteś uprawniony do rejestracji powłokiskrypt, który będzie uruchamiany przy każdej operacji na pliku, która ma miejsce w interesującym pliku / katalogu. W tym skrypcie możesz robić kopię zapasową bezpośrednio po zmianach (jeśli chcesz)


0 dla odpowiedzi nr 2

Małe wyszukiwanie ujawniłoby to: Bash: użycie wyniku diff w instrukcji if.

DIFF=$(diff newfile oldfile)
if [ "$DIFF" != "" ]; then
...

0 dla odpowiedzi № 3

Możesz również użyć md5deep mieszać pliki w katalogu, a następnie mieszać dane wyjściowe tego polecenia dla końcowej sumy kontrolnej:

hash=$(md5deep -rs folder | md5sum)

0 dla odpowiedzi nr 4

Nawiasy wokół diff w twoim kodzie nie są obowiązkowe, a idea polega na tym, że if instrukcja testuje sam kod powrotu poniższego polecenia. Więc nie ma potrzeby dzwonić test innym razem. Możesz również napisać:

if diff -q newFile oldFile &> /dev/null ; then...

(Przekierowanie do / dev / null jest tutaj, ponieważ diff zwraca a - bezużyteczne - wyjście)