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ć:
- Znajdź wszystkie foldery w katalogu
/fss/fin
- Tar folderów
- Przenieś foldery do innego katalogu
/fs/fi
który znajduje się na serwerzes11003232sz.net
- Na żądanie użytkownika powinno odpakować foldery i przenieść je z powrotem do katalogu orignal
/fss/fin
Odpowiedzi:
5 dla odpowiedzi № 1oto 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