[Rozw.] Jak spakować dane w różne archiwa

Serwery i sieci oparte na Slackware, wszelkiego rodzaju usługi, troubleshooting.

Moderatorzy: Moderatorzy, Administratorzy

cent4
Użytkownik
Posty: 289
Rejestracja: 2012-03-20, 11:18

[Rozw.] Jak spakować dane w różne archiwa

Post autor: cent4 »

Witam.
Mam pytanie: jak mogę zarchiwizować moje foldery do różnych archiwów?
Np. mam folder główny, a w nim podfoldery o nazwach: jeden, dwa, trzy i chciałbym, żeby powstały archiwa jeden.tar.gz, dwa.tar.gz, trzy.tar.gz itd.
Dotychczas robiłem tak i powstało jedno wielkie archiwum:

Kod: Zaznacz cały

tar -czf /home/domeny_$(date +%y%m%d).tar.gz /home/domains &>/dev/null
Ostatnio zmieniony 2016-05-11, 08:36 przez cent4, łącznie zmieniany 1 raz.
Pajaczek
Użytkownik
Posty: 1439
Rejestracja: 2006-08-03, 13:16
Lokalizacja: Winny Gród

Re: Jak spakować dane w różne archiwa

Post autor: Pajaczek »

Zakładając że nie znasz nazw podfolderów, oraz że chcesz wyświetlić (spakować) wszystkie podfoldery głównego:

Kod: Zaznacz cały

for i in `ls glowny`; do ls glowny/$i; done
Jeżeli znasz i masz pewność istnienia podfolderów i chcesz wyświetlić (spakować) tylko wybrane:

Kod: Zaznacz cały

ls glowny/{jeden,trzy}
Oczywiście tu masz przykład z wyświetleniem, zamień sobie to na pakowanie, edycję, usuwanie czy co tam sobie chcesz (oczywiście to może być sekwencja komend dla każdego podfolderu, rozdzielona średnikami, lub w postaci skryptu każda komenda w oddzielnej linii).
cent4
Użytkownik
Posty: 289
Rejestracja: 2012-03-20, 11:18

Re: Jak spakować dane w różne archiwa

Post autor: cent4 »

Hmmm
Zrobiłem tak i nie działa (ls z pominięciem 3 niepotrzebnych katalogów):

Kod: Zaznacz cały

for i in `ls /home/domains --hide={1kopia,1skrypty,1bazy_danych}`; do tar -czf /home/domains/1kopia/domena_$i_$(date +%y%m%d).tar.gz /home/domains; done
Tworzy mi dalej jedno wielkie archiwum: domena z datą.
Pajaczek
Użytkownik
Posty: 1439
Rejestracja: 2006-08-03, 13:16
Lokalizacja: Winny Gród

Re: Jak spakować dane w różne archiwa

Post autor: Pajaczek »

Jesteś blisko, ale...
...dodaj sobie jakieś echo do pętli, tak by za każdym przejściem wyświetliło zawartość zmiennej $i, podejrzewam że z jakiś względów masz puste (dziwne) $i zaś pętla wykonuje się raz.
...dlaczego próbujesz do każdego takiego archiwum wrzucić cały /home/domains?? powinno być /home/domains/$i ;)
...użyj ścieżek względnych, będzie Ci łatwiej przynajmniej potestować

Mały test:

Kod: Zaznacz cały

user@system:~/test/tmp$ ls -lha 
razem 12K
drwxrwxr-x 3 user user 4,0K maj  5 18:46 .
drwxrwxr-x 6 user user 4,0K maj  5 18:44 ..
drwxrwxr-x 5 user user 4,0K maj  6 22:29 b
user@system:~/test/tmp$ ls -lha b/
razem 20K
drwxrwxr-x 5 user user 4,0K maj  6 22:29 .
drwxrwxr-x 3 user user 4,0K maj  5 18:46 ..
drwxrwxr-x 2 user user 4,0K maj  5 18:45 1
drwxrwxr-x 2 user user 4,0K maj  5 18:45 2
drwxrwxr-x 2 user user 4,0K maj  5 18:45 3
user@system:~/test/tmp$ ls -lha b/1/
razem 8,0K
drwxrwxr-x 2 user user 4,0K maj  5 18:45 .
drwxrwxr-x 5 user user 4,0K maj  6 22:29 ..
-rw-rw-r-- 1 user user    0 maj  5 18:45 1
-rw-rw-r-- 1 user user    0 maj  5 18:45 a
-rw-rw-r-- 1 user user    0 maj  5 18:45 plik
user@system:~/test/tmp$ ls -lha b/2/
razem 8,0K
drwxrwxr-x 2 user user 4,0K maj  5 18:45 .
drwxrwxr-x 5 user user 4,0K maj  6 22:29 ..
-rw-rw-r-- 1 user user    0 maj  5 18:45 2
-rw-rw-r-- 1 user user    0 maj  5 18:45 a
-rw-rw-r-- 1 user user    0 maj  5 18:45 plik
user@system:~/test/tmp$ for i in `ls b`; do echo "jestem w katalogu: $i, jego zawartość to:"; ls b/$i; done
jestem w katalogu: 1, jego zawartość to:
1  a  plik
jestem w katalogu: 2, jego zawartość to:
2  a  plik
jestem w katalogu: 3, jego zawartość to:
3  a  plik
user@system:~/test/tmp$ for i in `ls b`; do tar -cjf b/$i.tar.bz2 b/$i; done
user@system:~/test/tmp$ for i in `ls b --hide={2,*tar.bz2}`; do tar -czf b/$i.tar.gz b/$i; done
user@system:~/test/tmp$ ls -lha b/
razem 40K
drwxrwxr-x 5 user user 4,0K maj  6 22:48 .
drwxrwxr-x 3 user user 4,0K maj  6 22:42 ..
drwxrwxr-x 2 user user 4,0K maj  5 18:45 1
-rw-rw-r-- 1 user user  185 maj  6 22:38 1.tar.bz2
-rw-rw-r-- 1 user user  172 maj  6 22:48 1.tar.gz
drwxrwxr-x 2 user user 4,0K maj  5 18:45 2
-rw-rw-r-- 1 user user  188 maj  6 22:38 2.tar.bz2
drwxrwxr-x 2 user user 4,0K maj  5 18:45 3
-rw-rw-r-- 1 user user  187 maj  6 22:38 3.tar.bz2
-rw-rw-r-- 1 user user  171 maj  6 22:48 3.tar.gz
cent4
Użytkownik
Posty: 289
Rejestracja: 2012-03-20, 11:18

Re: Jak spakować dane w różne archiwa

Post autor: cent4 »

OK.
Już zbudowałem, ale mam pytanie jak chciałbym do tego tara dodać datę i daję:
$1$(date +%y%m%d).tar.gz - to działa ok - nazwadomeny160505
ale już
$(date +%y%m%d)_$1.tar.gz - nie działa - jest tylko data
Jak dołączyć datę do początku plików?
Pajaczek
Użytkownik
Posty: 1439
Rejestracja: 2006-08-03, 13:16
Lokalizacja: Winny Gród

Re: Jak spakować dane w różne archiwa

Post autor: Pajaczek »

Znalazłem rozwiązanie, ale przyznam że nie rozumiem przyczyny.
Użyj innego znaku niż "_", np "-".

Edit: A jednak wystarczyło chwilę pomyśleć by znaleźć i przyczynę, teraz to zachowanie jest nawet logiczne ;) i oczywiście da się jako separatora użyć również "_" ;)
Dla ciekawskich: z jakich znaków może składać się nazwa zmiennej... :twisted:
cent4
Użytkownik
Posty: 289
Rejestracja: 2012-03-20, 11:18

Re: Jak spakować dane w różne archiwa

Post autor: cent4 »

Dzięki wszystko działa
Awatar użytkownika
mina86
Moderator
Posty: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: Jak spakować dane w różne archiwa

Post autor: mina86 »

Pajaczek pisze:

Kod: Zaznacz cały

for i in `ls glowny`; do ls glowny/$i; done
Nie! Po stokroć nie! Nigdy nie używaj `ls …` (w szczególności w pętli for). Poprawny kod to:

Kod: Zaznacz cały

for i in glowny/*; do ls "$i"; done
Co do oryginalnego problemu:

Kod: Zaznacz cały

cd /home/domains
for i in *; do
	case $i in 1kopia|1skrypty|1bazy_danych)
		continue
	esac
	tar czf "1kopia/domena-$i-$(date +%y%m%d).tar.gz" "$i"
done
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
Pajaczek
Użytkownik
Posty: 1439
Rejestracja: 2006-08-03, 13:16
Lokalizacja: Winny Gród

Re: [Rozw.] Jak spakować dane w różne archiwa

Post autor: Pajaczek »

A cóż jest takiego strasznego w tym ls? Czy chodzi Ci o to, że jest to fork do oddzielnej binarki?
Awatar użytkownika
Lizard
Moderator
Posty: 2629
Rejestracja: 2005-05-21, 15:48
Lokalizacja: miasto w mieście

Re: [Rozw.] Jak spakować dane w różne archiwa

Post autor: Lizard »

Porównaj "for I in `ls ...`":

Kod: Zaznacz cały

$ for I in $(ls test); do ls "test/$I"; done
test/plik1
ls: nie ma dostępu do 'test/plik': Nie ma takiego pliku ani katalogu
ls: nie ma dostępu do 'test/2': Nie ma takiego pliku ani katalogu
z "for I in .../*":

Kod: Zaznacz cały

$ for I in test/*; do ls "$I"; done
test/plik1
test/plik 2
Error 404 - footer not found
Pajaczek
Użytkownik
Posty: 1439
Rejestracja: 2006-08-03, 13:16
Lokalizacja: Winny Gród

Re: [Rozw.] Jak spakować dane w różne archiwa

Post autor: Pajaczek »

Ok... to fakt. Tytułowe zadanie sprawdzałem na "zbyt oczywistym" przykładzie.
Jak widać człowiek jak nie przećwiczy kilka razy błędnych zachowań, to się nie nauczy ;)
ODPOWIEDZ