Bash: Porovnání verzí
m třídění podle souborů je logičtější |
|||
Řádek 94: | Řádek 94: | ||
rm -f $LIST.* | rm -f $LIST.* | ||
</pre> | |||
=== Úklid pracovních adresářů (case, if, for, touch, test ) === | |||
Skript provádí úklid pracovních adresářů, může být pravidelně spouštěn v cronu (na serveru) nebo při startu systému (na osobním počítači). Soubory a adresářě starší než jeden týden přesouvá do adresáře .null, kde jsou smazány po dvou měsících. | |||
<pre> | |||
#! /bin/bash | |||
# | |||
# 1) cp uklid /etc/init.d | |||
# 2) update-rc.d uklid defaults | |||
# | |||
# nebo | |||
# | |||
# update-rc.d uklid start 93 S . | |||
# | |||
# pokud spustim pouze pri startu systemu (tecka je soucasti syntaxe) | |||
case "$1" in | |||
start) | |||
echo "Starting script uklid " | |||
# uklid pracovniho adresare | |||
# ----------------------------------------------------------- | |||
NULL=/home/cepek/.null | |||
for WORK in /home/cepek/work /home/cepek/.tmp | |||
do | |||
if ! test -d $NULL; then mkdir $NULL; fi | |||
touch --date="6 days ago" $NULL/time-stamp | |||
if ! test -d $NULL/`date -I` ; then | |||
mkdir $NULL/`date -I` | |||
fi | |||
if ! test -s $WORK/tmp...; then touch $WORK/tmp...; fi # avoids empty dir | |||
for i in $WORK/* | |||
do | |||
if test "$i" -ot $NULL/time-stamp; then | |||
chmod -R u+w "$i" 2>/dev/null | |||
touch "$i" | |||
mv -v "$i" $NULL/`date -I` | |||
fi | |||
done | |||
rmdir $NULL/`date -I` 2>/dev/null | |||
if ! test -s $WORK/tmp...; then rm -f $WORK/tmp...; fi | |||
touch --date="60 days ago" $NULL/time-stamp | |||
for i in $NULL/* | |||
do | |||
if test "$i" -ot $NULL/time-stamp; then | |||
rm -rf "$i" | |||
fi | |||
done | |||
done | |||
;; | |||
stop) | |||
echo "Stopping script uklid" | |||
;; | |||
*) | |||
echo "Usage: /etc/init.d/uklid {start|stop}" | |||
exit 1 | |||
;; | |||
esac | |||
exit 0 | |||
</pre> | </pre> | ||
Verze z 25. 7. 2009, 09:27
Bash je shell, tj. příkazový interpret, který je součástí operačního systému GNU.
Ukázky a příklady
Příkazy find, sed, grep, case, echo a cmp
Bash skript pro porovnání dvou adresářů s ošetřením jmen souborů obsahujících mezery, odfiltrováním skrytých souborů a rotující vrtulkou jako indikátorem průběhu zpracování (ukázka použití příkazu case
).
#!/bin/bash SRC=amonit-2009-04-29 TRG=amonit-CD FILES=$(cd $SRC && find -type f | sed s/\ /?/g | grep -v /\\. ) c=- for i in $FILES do case $c in -) c=\\ ;; \\) c=\| ;; \|) c=/ ;; /) c=- ;; esac echo -en "\b$c" cmp -l $SRC/$i $TRG/$i done
Příkazy for, if, find, grep, md5sum, awk, cmp a sqlite3
Skript prohledá zadné akresáře a vytvoří seznam duplicitní souborů, tj. identických souborů nacházejících se v různých adresářích. Implicitně hledá duplicity v běžném adresáři. Pro všechny nalezené soubory nejprve skript vypočítá jejich kontrolní součty (md5sum
), v databázi sqlite
je agreguje, soubory se stejnými md5 součty porovná příkazem cmp
a vytvoří jejich seznam.
Soubory se jmény obsahujícími mezery a znaky ( a soubory v adresarich cvs
jsou ignorovány.
#!/bin/bash LIST="/tmp/$$-duplicate-files" rm -f $LIST.* if [ "$1" == "" ]; then DIRS=. else DIRS="$1 $2 $3 $4 $5 $6 $7 $8 $9" fi cat <<EOF >$LIST.awk { print "INSERT INTO df VALUES ('" \$1 "', '" \$2 "');" } EOF sqlite3 $LIST.db "CREATE TABLE df (md5 char(32), file text)"; for d in $DIRS do for f in $(find $d -type f | grep -v "\ " | grep -v "(" | grep -v \/CVS\/ ) do md5sum $f | awk -f $LIST.awk | sqlite3 $LIST.db done done cat <<EOF > $LIST.sql DELETE FROM df WHERE md5 IN (SELECT md5 FROM df GROUP BY md5 HAVING count(file) = 1); SELECT a.file, b.file FROM df AS a JOIN df AS b ON a.md5 = b.md5 AND a.file < b.file ORDER BY a.file; EOF cat <<EOF > $LIST.awk {print "if cmp -s " \$1 " " \$2 " ; then echo cmp " \$1 " " \$2 "; fi" } EOF sqlite3 $LIST.db < $LIST.sql | awk -F \| -f $LIST.awk | bash rm -f $LIST.*
Úklid pracovních adresářů (case, if, for, touch, test )
Skript provádí úklid pracovních adresářů, může být pravidelně spouštěn v cronu (na serveru) nebo při startu systému (na osobním počítači). Soubory a adresářě starší než jeden týden přesouvá do adresáře .null, kde jsou smazány po dvou měsících.
#! /bin/bash # # 1) cp uklid /etc/init.d # 2) update-rc.d uklid defaults # # nebo # # update-rc.d uklid start 93 S . # # pokud spustim pouze pri startu systemu (tecka je soucasti syntaxe) case "$1" in start) echo "Starting script uklid " # uklid pracovniho adresare # ----------------------------------------------------------- NULL=/home/cepek/.null for WORK in /home/cepek/work /home/cepek/.tmp do if ! test -d $NULL; then mkdir $NULL; fi touch --date="6 days ago" $NULL/time-stamp if ! test -d $NULL/`date -I` ; then mkdir $NULL/`date -I` fi if ! test -s $WORK/tmp...; then touch $WORK/tmp...; fi # avoids empty dir for i in $WORK/* do if test "$i" -ot $NULL/time-stamp; then chmod -R u+w "$i" 2>/dev/null touch "$i" mv -v "$i" $NULL/`date -I` fi done rmdir $NULL/`date -I` 2>/dev/null if ! test -s $WORK/tmp...; then rm -f $WORK/tmp...; fi touch --date="60 days ago" $NULL/time-stamp for i in $NULL/* do if test "$i" -ot $NULL/time-stamp; then rm -rf "$i" fi done done ;; stop) echo "Stopping script uklid" ;; *) echo "Usage: /etc/init.d/uklid {start|stop}" exit 1 ;; esac exit 0