2013-04-10 13 views
12

Mam kilka katalogów, które należy przywrócić, ale najpierw muszą być spakowane do .tar. Czy istnieje skrypt, który pozwoliłby spakować wszystkie ponad 100 katalogów do ich własnych programów, tak aby katalog stał się dir.tar.dla każdego dir utworzyć plik tar

tej pory próba:

for i in *; do tar czf $i.tar $i; done 
+2

Jeśli istnieje sposób ich jawnego wyliczenia ... tak. – tink

+0

Są sami w swoim własnym reżimie, jeśli to pomaga. –

+2

To, co może oznaczać tink prawdopodobnie oznacza, że ​​SO nie jest stroną "napisz mi skrypty dla mnie". Czego spróbowałeś do tej pory? –

Odpowiedz

31

Skrypt który napisałeś nie będzie działać, jeśli masz jakieś spacji w nazwie katalogu, ponieważ nazwa zostanie podzielona, ​​a także będzie tar pliki, jeśli one istnieją na ten poziom.

Można użyć tego polecenia do listy katalogów nie rekurencyjnie:

find . -type d -maxdepth 1 -mindepth 1 

i ten jeden wykonać smołę na każdej z nich:

find . -type d -maxdepth 1 -mindepth 1 -exec tar cvf {}.tar {} \; 
+3

Dodaj '', aby usunąć oryginalne katalogi po zarchiwizowaniu: 'znajdź. -maxdepth 1 -mindepth 1-typ d -exec tar cvf {} .tar {} --remove-files \; ' –

+6

kompresuj' znajdź. -type d -maxdepth 1 -mindepth 1 -exec tar zcvf {} .tar.gz {} \; ' –

5

Czy masz żadnych nazw katalogów ze spacjami w nich na tym poziomie? Jeśli nie, twój skrypt będzie działał dobrze.

Co zwykle zrobić to napisać skrypt z poleceniem I chcesz wykonać powtórzył się:

$ for i in * 
do 
    echo tar czf $i.tar $i 
done 

Następnie można spojrzeć na wyjściu i sprawdzić, czy jest tym, co chcesz. Po ustaleniu, że program będzie działał, zmodyfikuj wiersz polecenia i usuń komendę echo.

1

jeśli liczba katalogów są bardzo duże, a ich nazwiska są zbyt długie

po wykonaniu numeru rachunku jeden

for i in * 
    do 
    echo tar czf $i.tar $i 
    done 

otrzymasz błąd „łańcuch zbyt długi”

1

Jeśli istnieją spacje w nazwach katalogów, a następnie po prostu umieść zmienne wewnątrz podwójnego cudzysłowu:

for i in * 
do 
    tar czf "$i.tar" "$i" 
done