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 № 1Po 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)