Table of content:
Intro
La inceput voi spune ca acest lucru trivial poate fi facut in diferite moduri, fie prin comenzi direct in consola, fie intr-un manager de fisiere. Insa eu am scris acest script pentru a intari cunostintele in limbajele de sconsola. :)
Sarcina
Avem doua directorii “input” si “output”. In fiecare din ele se afla fisire , nu are importanta de ce tip si ce contin. Este necesar de a efectua urmatoarele operatii
-
Crearea folderelor in “output” dupa cele din “input”
-
Efectuarea unei operatii, de ex. modificarea unui cuvint cu
sed
, in fisierele din “Input” si transferarea lor in “Output” cu pastrarea denumirii si denumirii folderului. -
Daca folderul nu exista in “Output” , acesta trebuie creat
-
Feetch-uri:
4.1 Raportarea erorilor.
4.2 Numarul fisierelor modificate.
4.3 Timpul de efectuare a ciclului.
Scriptul propriu zis
Datele de intrare vor fi niste foldere de ex. pe ani.
.
|-- input
| |-- 1991
| | |-- XX-2-145-91.pdf
| | |-- XX-2-189-91.pdf
| | |-- XX-2-4479-91.pdf
| | |-- XX-2-4489-91.pdf
| | |-- XX-2-4579-91.pdf
| | |-- XX-2-A-2459-91.pdf
| | `-- XX-2-A2-459-91.pdf
| |-- 1992
| | |-- XX-2-137-92.pdf
| | |-- XX-2-336-92.pdf
| | |-- XX-2-737-92.pdf
| | `-- XX-2-777-92.pdf
| |-- 1993
| | |-- XX-2-1654-93.pdf
| | |-- XX-2-3424-93.pdf
| | |-- XX-2-3644-93.pdf
| | |-- XX-2-3654-93.pdf
| | `-- XX-2-656-93.pdf
| |-- 1994
| | |-- XX-2-211-94.pdf
| | |-- XX-2-221-94.pdf
| | |-- XX-2-3451-94.pdf
| | |-- XX-2-4411-94.pdf
| | `-- XX-2-4451-94.pdf
| |-- 1995
| | |-- XX-2-3221-95.pdf
| | |-- XX-2-3424-95.pdf
| | |-- XX-2-3521-95.pdf
| | |-- XX-2-3522-95.pdf
| | |-- XX-2-3524-95.pdf
| | `-- XX-2-3527-95.pdf
| |-- 1996
| | |-- XX-1-110-97.pdf
| | |-- XX-1-123-97.pdf
| | |-- XX-1-143-97.pdf
| | `-- XX-1-587-97.pdf
| |-- 1997
| | |-- XX-2-22-97.pdf
| | |-- XX-2-993-97.pdf
| | `-- XX-2-995-97.pdf
| |-- 1998
| | |-- XX-2-143-98.pdf
| | `-- XX-2-465-98.pdf
| `-- 1999
| |-- XX-2-110-99.pdf
| |-- XX-2-25-99.pdf
| |-- XX-2-3389-99.pdf
| `-- XX-2-5555-99.pdf
|-- output
`-- script.sh
Scriptul “script.sh” - Acest script va crea doar folderele
1 2 3 4 5 6 7 8 9 | #!/bin/bash
i_dir="input/"
o_dir="output/"
i=0
for dir in `ls -d $i_dir*` ; do
mkdir $o_dir/`echo "$dir" | awk -F"/" '{print $2}'`;
i=$(expr $i + 1);
done;
echo "Au fost create "$i " foldere"
|
Dupa executie avem:
root@xubuntu:/home/jeka/scripting# ./script.sh
Au fost create 9 foldere
.
|-- input
| |-- 1991
| | |-- XX-2-145-91.pdf
| | |-- XX-2-189-91.pdf
| | |-- XX-2-4479-91.pdf
| | |-- XX-2-4489-91.pdf
| | |-- XX-2-4579-91.pdf
| | |-- XX-2-A-2459-91.pdf
| | `-- XX-2-A2-459-91.pdf
| |-- 1992
| | |-- XX-2-137-92.pdf
| | |-- XX-2-336-92.pdf
| | |-- XX-2-737-92.pdf
| | `-- XX-2-777-92.pdf
| |-- 1993
| | |-- XX-2-1654-93.pdf
| | |-- XX-2-3424-93.pdf
| | |-- XX-2-3644-93.pdf
| | |-- XX-2-3654-93.pdf
| | `-- XX-2-656-93.pdf
| |-- 1994
| | |-- XX-2-211-94.pdf
| | |-- XX-2-221-94.pdf
| | |-- XX-2-3451-94.pdf
| | |-- XX-2-4411-94.pdf
| | `-- XX-2-4451-94.pdf
| |-- 1995
| | |-- XX-2-3221-95.pdf
| | |-- XX-2-3424-95.pdf
| | |-- XX-2-3521-95.pdf
| | |-- XX-2-3522-95.pdf
| | |-- XX-2-3524-95.pdf
| | `-- XX-2-3527-95.pdf
| |-- 1996
| | |-- XX-1-110-97.pdf
| | |-- XX-1-123-97.pdf
| | |-- XX-1-143-97.pdf
| | `-- XX-1-587-97.pdf
| |-- 1997
| | |-- XX-2-22-97.pdf
| | |-- XX-2-993-97.pdf
| | `-- XX-2-995-97.pdf
| |-- 1998
| | |-- XX-2-143-98.pdf
| | `-- XX-2-465-98.pdf
| `-- 1999
| |-- XX-2-110-99.pdf
| |-- XX-2-25-99.pdf
| |-- XX-2-3389-99.pdf
| `-- XX-2-5555-99.pdf
|-- output
| |-- 1991
| |-- 1992
| |-- 1993
| |-- 1994
| |-- 1995
| |-- 1996
| |-- 1997
| |-- 1998
| `-- 1999
`-- script.sh
Versiunea prefinalaa scriptului
Acest script va insera in fiecare fisier “Sandel scrie in bash” Acest script este prefinal deoarece acesta insereaza ceva date in fisierele din folderele sursa
Scriptul “script.sh”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/bin/bash
i_dir="input/" #Folderul in care se afla folderele cu fisierele sursa
o_dir="output/" #Folderul in care vor fi create folderele cu fisiere
d=0 #Contorul pentru directorii
f=0 #Contorul pentru fisiere
for dir in `ls -d $i_dir*` ; do #Ciclul pentru foldere
mkdir $o_dir/`echo "$dir" | awk -F"/" '{print $2}'`;
for file in `ls $dir/*.pdf`; do #Ciclul pentru fisiere
echo "Sandel scrie in bash" > $file;
f=$(expr $f + 1); #Incrementare contor penru fisiere
done;
i=$(expr $i + 1); #Incrementare contor pentru foldere
done;
echo "Au fost create "$i " foldere."
echo "Au fost modificate "$f "fisiere."
|
Executam
root@xubuntu:/home/jeka/scripting# ./script.sh
Au fost create 9 foldere.
Au fost modificate 40 fisiere.
Versiunea finala a scriptului
Acest script va insera in fiecare fisier “Sandel scrie in bash” Acest script este prefinal deoarece acesta insereaza ceva date in fisierele din folderele sursa
Scriptul “script.sh”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/bin/bash
i_dir="input/" #Folderul in care se afla folderele cu fisierele sursa
o_dir="output/" #Folderul in care vor fi create folderele cu fisiere
d=0 #Contorul pentru directorii
f=0 #Contorul pentru fisiere
for dir in `ls -d $i_dir*` ; do #Ciclul pentru foldere
mkdir $o_dir/`echo "$dir" | awk -F"/" '{print $2}'`;
for file in `ls $dir/*.pdf`; do #Ciclul pentru fisiere
cp $file $o_dir/`echo "$dir" | awk -F"/" '{print $2}'`/ #Copie fisierele
f=$(expr $f + 1); #Incrementare contor penru fisiere
done;
i=$(expr $i + 1); #Incrementare contor pentru foldere
done;
echo "Au fost create "$i " foldere."
echo "Au fost modificate "$f "fisiere."
|
.
|-- input
| |-- 1991
| | |-- XX-2-145-91.pdf
| | |-- XX-2-189-91.pdf
| | |-- XX-2-4479-91.pdf
| | |-- XX-2-4489-91.pdf
| | |-- XX-2-4579-91.pdf
| | |-- XX-2-A-2459-91.pdf
| | `-- XX-2-A2-459-91.pdf
| |-- 1992
| | |-- XX-2-137-92.pdf
| | |-- XX-2-336-92.pdf
| | |-- XX-2-737-92.pdf
| | `-- XX-2-777-92.pdf
| |-- 1993
| | |-- XX-2-1654-93.pdf
| | |-- XX-2-3424-93.pdf
| | |-- XX-2-3644-93.pdf
| | |-- XX-2-3654-93.pdf
| | `-- XX-2-656-93.pdf
| |-- 1994
| | |-- XX-2-211-94.pdf
| | |-- XX-2-221-94.pdf
| | |-- XX-2-3451-94.pdf
| | |-- XX-2-4411-94.pdf
| | `-- XX-2-4451-94.pdf
| |-- 1995
| | |-- XX-2-3221-95.pdf
| | |-- XX-2-3424-95.pdf
| | |-- XX-2-3521-95.pdf
| | |-- XX-2-3522-95.pdf
| | |-- XX-2-3524-95.pdf
| | `-- XX-2-3527-95.pdf
| |-- 1996
| | |-- XX-1-110-97.pdf
| | |-- XX-1-123-97.pdf
| | |-- XX-1-143-97.pdf
| | `-- XX-1-587-97.pdf
| |-- 1997
| | |-- XX-2-22-97.pdf
| | |-- XX-2-993-97.pdf
| | `-- XX-2-995-97.pdf
| |-- 1998
| | |-- XX-2-143-98.pdf
| | `-- XX-2-465-98.pdf
| `-- 1999
| |-- XX-2-110-99.pdf
| |-- XX-2-25-99.pdf
| |-- XX-2-3389-99.pdf
| `-- XX-2-5555-99.pdf
|-- output
| |-- 1991
| | |-- XX-2-145-91.pdf
| | |-- XX-2-189-91.pdf
| | |-- XX-2-4479-91.pdf
| | |-- XX-2-4489-91.pdf
| | |-- XX-2-4579-91.pdf
| | |-- XX-2-A-2459-91.pdf
| | `-- XX-2-A2-459-91.pdf
| |-- 1992
| | |-- XX-2-137-92.pdf
| | |-- XX-2-336-92.pdf
| | |-- XX-2-737-92.pdf
| | `-- XX-2-777-92.pdf
| |-- 1993
| | |-- XX-2-1654-93.pdf
| | |-- XX-2-3424-93.pdf
| | |-- XX-2-3644-93.pdf
| | |-- XX-2-3654-93.pdf
| | `-- XX-2-656-93.pdf
| |-- 1994
| | |-- XX-2-211-94.pdf
| | |-- XX-2-221-94.pdf
| | |-- XX-2-3451-94.pdf
| | |-- XX-2-4411-94.pdf
| | `-- XX-2-4451-94.pdf
| |-- 1995
| | |-- XX-2-3221-95.pdf
| | |-- XX-2-3424-95.pdf
| | |-- XX-2-3521-95.pdf
| | |-- XX-2-3522-95.pdf
| | |-- XX-2-3524-95.pdf
| | `-- XX-2-3527-95.pdf
| |-- 1996
| | |-- XX-1-110-97.pdf
| | |-- XX-1-123-97.pdf
| | |-- XX-1-143-97.pdf
| | `-- XX-1-587-97.pdf
| |-- 1997
| | |-- XX-2-22-97.pdf
| | |-- XX-2-993-97.pdf
| | `-- XX-2-995-97.pdf
| |-- 1998
| | |-- XX-2-143-98.pdf
| | `-- XX-2-465-98.pdf
| `-- 1999
| |-- XX-2-110-99.pdf
| |-- XX-2-25-99.pdf
| |-- XX-2-3389-99.pdf
| `-- XX-2-5555-99.pdf
`-- script.sh
Varianta optimizata
Am optimizat scriptul prin includerea unei comenzi ls
care arata fisierele sau folderele ls -1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/bin/bash
i_dir="input/" #Folderul in care se afla folderele cu fisierele sursa
o_dir="output/" #Folderul in care vor fi create folderele cu fisiere
d=0 #Contorul pentru directorii
f=0 #Contorul pentru fisiere
start=`date +%s`
for dir in `ls $i_dir -1` ; do #Ciclul pentru foldere
mkdir $o_dir/$dir;
for file in `ls $i_dir/$dir/*.pdf`; do #Ciclul pentru fisiere
cp $file $o_dir/$dir/ #Copie fisierele
f=$(expr $f + 1); #Incrementare contor penru fisiere
done;
i=$(expr $i + 1); #Incrementare contor pentru foldere
done;
end=`date +%s`
runtime=$((end-start))
echo "Au fost create "$i " foldere."
echo "Au fost modificate "$f "fisiere."
echo "A durat" $runtime " sec."
|
Recomandari
Putem folosi acest ciclu if
pentru a verifica daca este deja folderul
#-Check dir
if [ ! -d "$DIR" ];then
echo "Error: Please create directory $DIR, with write permissions for user \"$(/bin/id -un)\""
exit 1
fi
Comments
comments powered by Disqus