Zadanie: stworzyc skrypt, ktory z pliku tekstowego pobiera sciezki plikow i kopiuje je (pliki) do uprzednio stworzonego katalogu /root/backup.
Pliki:
- backup.sh
- list
W “list” mamy liste istniejących plikow, ktore chcemy skopiowac do uprzednio utworzonego katalogu. np:
/home/user/plik.txt
/home/user/video.mp4
/home/user/piosenka.mp3
W backup.sh mamy skrypt, ktory kopiuje te pliki:
#!/bin/bash //oczywiscie mowimy, ze bedziemy pisac w bashu
for path in `if [ $1 ]; then cat $1; fi`; do
cp --parents $path $2
done
Skryptu uzywamy w następujący sposób:
./backup.sh plik_lista /sciezka/do/backupu
W naszym przypadku zamiast plik_lista bedzie list, a zamiast /sciezka/do/backupu bedzie /root/backup
Wytłumaczenie:
Między znakami “ znajduje się zwykłe polecenie powłoki do wykonania, które mówi, że jeśli $1 (czyli pierwszy argument – plik_lista)nie jest pusty, to wykonaj “cat $1″, czyli skrypt po prostu zada pokazanie pliku. Reszta linijki stanowi petle, ktora dla kazdej linii (teraz dla programu znanej jako $path), z pliku $1, wykonuje następującą instrukcję:
cp –parents $path $2 – skopiuj plik z $path (sciezka wzieta z pliku) do $2 (drugi argument – /sciezka/do/backupu). “–parents” pozwala nam na przekopiowanie calej sciezki. Tzn: jesli $path=/etc/passwd, to skopiowany plik bedzie w: /sciezka/do/backupu/etc/passwd
Inne (dluzsze) mozliwosci:
#!/bin/bash
main=/home/jjkrol/Dokumenty/informatyka/backup
mkdir $main
for path in `if [ $1 ]; then cat $1; fi`; do
mkdir -p $main$(echo $path |awk -F'/' '{OFS="/"; $NF=""; print}')
cp $path $main$path
done
oraz
#!/bin/bash
if [ $1 ]; then
main=/home/jjkrol/Dokumenty/informatyka/backup
mkdir $main
for path in `cat $1`; do
array=($(echo $path|awk -F'/' '{$1=$1;print}'))
unset array[${#array[@]}-1]
for dir in ${array[@]}; do
temppath=$temppath/$dir
echo $temppath
if [ ! -d $main/$temppath ]; then
mkdir $main/$temppath
echo 'stworzono'
else
echo tak
fi
done
cp $path $main/$path
done
fi