/ / Uniksowy skrypt do znajdowania wszystkich folderów w katalogu, a następnie tar i przenoszenie ich - bash, unix, shell, tar

Skrypt uniksowy do znajdowania wszystkich folderów w katalogu, a następnie tarowania i przenoszenia - bash, unix, shell, tar

Zasadniczo muszę uruchomić skrypt Unix, aby znaleźć wszystkie foldery w katalogu / fss / fin, jeśli istnieje; następnie mam go i przejdź do innego katalogu / fs / fi.

Oto moje polecenie:

find /fss/fin -type d -name  "essbase" -print

Tutaj bezpośrednio wspomniałem nazwę folderu essbase. Ale zamiast tego chciałbym znaleźć wszystkie foldery w /fss/fin i wykorzystaj je wszystkie.

Jak znaleźć wszystkie foldery w /fss/fin directory & tar, aby je przenieść /fs/fi?

Wyjaśnienie 1:

Tak, muszę znaleźć tylko wszystkie foldery w katalogu /fss/fin katalog używający skryptu powłoki Uniksa i taruj go do innego katalogu /fs/fi.

Wyjaśnienie 2:

Chcę to wyjaśnić za pomocą wymogu. Skrypt powłoki powinien zawierać:

  1. Znajdź wszystkie foldery w katalogu /fss/fin
  2. Tar folderów
  3. Przenieś foldery do innego katalogu /fs/fi który znajduje się na serwerze s11003232sz.net
  4. Na żądanie użytkownika powinno odpakować foldery i przenieść je z powrotem do katalogu orignal /fss/fin

Odpowiedzi:

5 dla odpowiedzi № 1

oto przykład, nad którym pracuję, co może doprowadzić cię we właściwym kierunku

BackUpDIR="/srv/backup/"
SrvDir="/srv/www/"
DateStamp=$(date +"%Y%m%d");

for Dir in $(find $SrvDir* -maxdepth 0 -type d );
do
FolderName=$(basename $Dir);
tar zcf "$BackUpDIR$DateStamp.$FolderName.tar.gz" -P $Dir
done

2 dla odpowiedzi nr 2

Od tar robi katalogi automatycznie, naprawdę nie musisz wiele robić. Zakładając GNU tar:

tar -C /fss/fin -cf - essbase |
tar -C /fs/fi   -xf -

"-C"opcja zmienia katalog przed uruchomieniem tar wypisuje na standardowe wyjście (samotne "-") wszystko, co można znaleźć w essbase informator. Wynik tego tar jest podłączony do drugiego tar, który czyta jej standardowe wejście (samotny "-", zabawa nie jest!).


Zakładając odnalezienie GNU, możesz również:

(cd /fss/fin; tar -cf - $(find . -maxdepth 1 -type d | sed "/^.$/d")) |
tar -xf - -C /fs/fi

Spowoduje to zmianę katalogu na katalog źródłowy;uruchamia "find" o maksymalnej głębokości 1, aby znaleźć katalogi i usuwa bieżący katalog z listy za pomocą "sed"; pierwszy "tar" zapisuje następnie wynik do drugiego, który jest taki sam jak poprzednio (poza tym zmieniłem kolejność argumentów, aby podkreślić paralelizm między dwoma wywołaniami).


Jeśli twoje katalogi najwyższego poziomu (te w / fss / fin) mają spacje w nazwach, to jest jeszcze więcej pracy do wykonania - zakładam, że żadne z katalogów, których kopię zapasową ma się rozpoczynać, zaczyna się od ".":

(cd /fss/fin; find * -maxdepth 0 -type d -print 0 | xargs -0 tar -cf -) |
tar -xf - -C /fs/fi

To eliminuje nie-katalogi z listygenerowane przez "*" i zapisuje je w NUL "

Jeśli masz nazwy katalogów zaczynające się od "." zebrać, a następnie dodać ".[a-z]*"lub inny odpowiedni wzór po" * ", ważne jest, aby to, czego używasz, nie zawierało". "lub" .. "Jeśli masz nazwy zaczynające się od kresek w katalogu, musisz użyć"./*" i "./.[a-z]*".

Jeśli masz jeszcze bardziej przewrotne wymagania, wyraź je jednoznacznie w poprawce do pytania.


0 dla odpowiedzi № 3
find /fss/fin -d 1 -type d -name "*" -print

Powyższe polecenie wyświetla listę podkatalogów pierwszego poziomu w / fss / fin. Wtedy możesz zrobić cokolwiek z tym. Na przykład. tar do katalogu wyjściowego, jak w poniższym poleceniu

tar -czf /fss/fi/outfile.tar.gz `find /fss/fin -d 1 -type d -name "*" -print`

Oryginalna struktura katalogów zostanie odtworzona po rozwinięciu.


0 dla odpowiedzi nr 4

Oto przykład basha (zmiana /fss/fin, /fs/fi ze swoimi ścieżkami):

dirs=($(find /fss/fin -type d))
for dir in "${dirs[@]}"; do
tar zcf "$dir.tgz" "$dir" -P -C /fs/fi && mv -v "$dir" /fs/fi/
done

który znajduje wszystkie foldery, tar oddzielnie, a jeśli się powiedzie - przenieś je do innego folderu.


-1 dla odpowiedzi № 5

Powinno to zrobić:

#!/bin/sh

list=`find . -type d`

for i in $list
do
if [ ! "$i" == "." ]; then
tar -czf ${i}.tar.gz ${i}
fi
done

mv *.tar.gz ~/tardir