You are not logged in.
hi
I would like to have opinions on this script to make backups
#!/bin/bash
#initie le 5/14
#conditions initiales pour le bon fonctionnement du script:
# -sdX -> ddi source
# -sdY -> dde destinataire
# -partition DOCUMENTS (inclu dans sdX) est deja montee
# -partition SAUVEGARDES (inclu dans sdY) n'est pas encore montee
# -les programmes wmctrl et countdown sont deja installes
# -on considere que les clefs usb n'ont qu'une partition chacune
# -plusieurs clef usb peuvent etre connectees a la fois
# methode:
# -> citer les sources
# -> pres des fonctionnalitees du script
# -> horodater les modifs avec description
# -> erreur > fichier
# -> ...
# fonctionnalitees:
# -> eteint la machine à la fin de la sauvegarde
# -> sauvegarde part docs + sys + 1ere part de clefs clefs_usb
# -> grace à renice, ne prend pas trop de ressource
#ne sert à rien:
pause()
{
read -p "$*"
}
restore_mbr()
{
dd if=backup-sda.mbr of=/dev/sda
sfdisk /dev/sda < backup-sda.sfdisk
}
check_mount()
{
if grep -qs '$1' /proc/mounts
then
return 0
else
return 1
fi
}
#
check_device()
{
if [ -z "$(blkid $1)" ]
then
return 0
else
return 1
fi
}
save_MBR()
{
local ddi=${mount_point_source:0:8}
local dde=${mount_point_dest:0:8}
rm -Rf $dest_sauv/mbr/
rm -Rf $dest_sauv/table_des_partitions/
check_dir $dest_sauv/mbr/
check_dir $dest_sauv/table_des_partitions/
echo "sauvegardes des MBR des dd contenant les partions DOCUMENTS & SAUVEGARDES"
sudo dd if=$ddi of=$dest_sauv/mbr/ddi_$date bs=512 count=1 > /dev/null 2>&1
sudo dd if=$ddi of=$dest_sauv/mbr/dde_$date bs=512 count=1 > /dev/null 2>&1
sudo sfdisk -d $dde > $dest_sauv/table_des_partitions/ddi_$date.dmp > /dev/null 2>&1
sudo sfdisk -d $dde > $dest_sauv/table_des_partitions/dde_$date.dmp > /dev/null 2>&1
}
mount_part()
{
echo "creation du dossier qui servira a monter la partition $1 puis montage de cette derniere"
if [ ! -d $2 ]
then
sudo mkdir $2
fi
sudo mount $3 $2
}
umount_part()
{
echo "demontage de la partition $1 puis suppression du dossier qui servit a monter cette derniere"
sudo umount $2
sudo rmdir $2
}
check_dir()
{
if [ ! -d "$1" ]
then
mkdir -p $1
fi
}
save_DOCUMENTS()
{
local delta=""
let "delta=60*60*24*14"
local tmp=""
local today=$date
check_dir $destinataire/docs_supprimes/$today/
check_dir $destinataire/logs/
echo "sauvegarde du contenu de la partition DOCUMENTS"
sudo rsync -hau --delete --backup --backup-dir=$destinataire/docs_supprimes/$today/ --stats --exclude=**/lost+found*/ --exclude=**/*Trash*/ --exclude=**/*trash*/ $source/ $destinataire/documents_perso/ > $destinataire/logs/documents_perso_$today
ls $destinataire/docs_supprimes/ > tmp.txt
if [ -s tmp.txt ]
then
while read dir
do
let "tmp=$(date +%s)-${dir##*_}"
if [ "$tmp" -gt "$delta" ]
then
rm -R dir
fi
done < tmp.txt
fi
rm tmp.txt
}
save_systeme()
{
check_dir $destinataire/systeme/
check_dir $destinataire/logs/
echo "sauvegarde du systeme actuel"
sudo rsync -hau --delete --stats --numeric-ids --exclude=/media --exclude=/tmp --exclude=/dev --exclude=/proc --exclude=/sys --exclude=/mnt --exclude=**/lost+found*/ --exclude=**/*Trash*/ --exclude=**/*trash*/ / $destinataire/systeme >> $destinataire/logs/systeme_$date
blkid > $destinataire/logs/partitionnement_du_ddi_contenant_le_systeme_sauvegarde.txt
}
save_usb_key()
{
local dir_key_source="/media/key"
local dir_key_dest=""
local id_key=""
if [ -d "/dev/disk/by-id/*usb*" ]
then
ls /dev/disk/by-id/*usb* | grep part1 >> mount_point_key.txt
while read mount_point_key
do
id_key=${mount_point_key##*/}
dir_key_dest="$dest_sauv/clefs_usb/${id_key}/"
echo "sauvegarde du contenu de la clef usb : $id_key"
check_dir $dir_key_dest
mount_part "de la clef usb" "$dir_key_source/" "$mount_point_key"
rsync -hau $1 --stats --exclude=**/lost+found*/ --exclude=**/*Trash*/ --exclude=**/*trash*/ $dir_key_source/ $dir_key_dest > $dir_key_dest/log_$date
umount_part "de la clef usb" "$dir_key_source/"
echo ""
done < mount_point_key.txt
rm mount_point_key.txt
else
echo "aucune clef usb n'est connectee!"
fi
}
shutdown()
{
wmctrl -a Konsole
echo -e "\033[1;31mextinction de l'ordinateur dans 30 secondes!\033[0m"
countdown.sh 30
sudo shutdown -ah now
}
restore_systeme()
{
local answer=""
check_dir $destinataire/logs/
echo "restauration du systeme sauvegarde sur $1"
echo "Voulez-vous supprimer le contenu de $1? [y/n]"
read answer
if [ "$answer" = "Y" -o "$answer" = "y" ];
then
sudo rm -R $1/
sudo rsync -ha --stats --numeric-ids $destinataire/systeme/ $1 > $destinataire/logs/restore_system_${date}.txt
cd $1
sudo mkdir mnt tmp proc media dev sys
fi
}
show_help()
{
echo "aide:"
echo " -k sauvegarde du contenu des clefs usb"
echo " -K idem avec suppressions des fichiers de destinations qui ne sont pas a la source"
echo " -m sauvegarde des MBR uniquement"
echo " -d sauvegarde des documents uniquement"
echo " -s sauvegarde du systeme uniquement"
echo " -x execution de shutdown -ah now"
echo " -r /dev/sdXY restauration du systeme"
echo "sinon, tout en meme temps dans l'ordre sauf les parametres -r, -d, -k et undel"
echo " undel idem mais avec le parametre -d au lieu de -D"
echo " -h cette aide"
}
load_conf()
{
cd ~
type wmctrl > /dev/null 2>&1 || (print "installation de wmctrl" && sudo apt-get -y install wmctrl)
if [ ! -e ~/.backup_conf.cfg ]
then
echo "Voici les partitions disponibles:"
blkid -o list
echo -e -n "Entrez l'uuid de la partition DOCUMENTS:\n\t->"
read -r uuid_source
echo -e -n "Entrez l'uuid de la partition SAUVEGARDES:\n\t->"
read -r uuid_dest
echo -e -n "Entrez l'adresse de la source:\n\t->"
read -r source
touch ~/.backup_conf.cfg
echo "$uuid_source $uuid_dest $source" > ~/.backup_conf.cfg
else
read -r uuid_source uuid_dest source < ~/.backup_conf.cfg
fi
}
manage_saves()
{
if check_device "$mount_point_dest/"
then
mount_part "SAUVEGARDES" "$destinataire/" "$mount_point_dest"
case $1 in
DOCS)
save_DOCUMENTS
;;
SYS)
save_systeme
;;
BOTH)
save_systeme
save_DOCUMENTS
;;
esac;
umount_part "SAUVEGARDES" "$destinataire/"
else
echo "le dd de destination n'est pas connecte!"
fi
}
date=`date +%Y-%m-%d-%k-%M_%s`
source=""
destinataire="/media/SAUVEGARDES"
file_errors="$destinataire/logs/erreurs.txt"
mount_point_dest=""
mount_point_source=""
uuid_source=""
uuid_dest=""
load_conf
dest_sauv="$source/Documents/backup"
mount_point_dest=$(blkid -U $uuid_dest)
mount_point_source=$(blkid -U $uuid_source)
# echo "$mount_point_dest"
# if check_device "$mount_point_dest/"
# then
# echo "device monte!"
# else
# echo "non"
# fi
# exit 1
check_dir $dest_sauv
# On donne une priorité faible au processus pour ne pas dégrader les performances des autres applications
renice +19 $$
while getopts "sdmhxr:k" opt
do
case $opt in
s)
echo "-- sauvegarde du systeme uniquement --"
manage_saves "SYS"
;;
d)
echo "-- sauvegarde des documents uniquement --"
manage_saves "DOCS"
;;
m)
echo "-- sauvegarde des MBR uniquement --"
save_MBR
;;
h)
show_help
exit 1
;;
x)
shutdown
;;
r)
nom_part=$(blkid $OPTARG)
nom_part=${nom_part##*LABEL=\"}
nom_part=${nom_part%%\"*}
if [[ $OPTARG != /dev/sd* ]]
then
echo "l'argument doit etre du type \"/dev/sdXY\", avec X et Y des lettres de l'alphabet!"
exit 0
fi
echo "-- restauration du systeme sur la partition $nom_part --"
mount_part "SAUVEGARDES" "$destinataire/" "$mount_point_dest"
mount_part "$nom_part" "/media/RESTORE/" "$OPTARG"
restore_systeme "/media/RESTORE"
umount_part "$nom_part" "/media/RESTORE/"
umount_part "SAUVEGARDES" "$destinataire/"
unset nom_part
;;
k)
save_usb_key ""
;;
K)
save_usb_key "--delete"
;;
\?)
echo "invalid option: -$OPTARG"
show_help
exit 0
;;
esac
done
if [ $# -eq 0 ]
then
echo "-- sauvegarde generale --"
save_usb_key "--delete"
save_MBR
manage_saves "BOTH"
shutdown
fi
exit 1
# le programme countdown.sh:
# #!/bin/bash
#
# beginning=$(date +%s)
# diff="0"
# rest="$1"
# tmp="0"
# now="0"
#
# echo -n "$1"
# while [ "$diff" -lt "$1" ]
# do
# let "now=$(date +%s)"
# let "diff=now-beginning-1"
# let "tmp=$1-diff"
# if [ "$tmp" -lt "$rest" ]
# then
# let "rest=$1-diff"
# echo -n ", $rest"
# fi
# done
#
# echo ""
if not, would you know a site that allows you to publish bash scripts?
Thanks!
Bye.
Offline
You can post them here, or to http://codereview.stackexchange.com/, but as a courtesy, you should post them in English https://wiki.archlinux.org/index.php/Fo … s_and_Code
Offline
Its not beautiful, but I've been using this script for a few years to interact with pacman and packer so I don't have to remember the various options for things I don't do frequently.
Also, to make things short and sweet, the script is named "r" and the options are each one character.
Common commands below:
$ r up # Update pacman
$ r ua # Update pacman, then AUR (with packer)
$ r c # Remove cached packages over 2 versions old
$ r ip <package> # Install using pacman
$ r ua <aur_package> # Install using packer
$ r sp <package> # Search official repository for package
etc....
Note: I forgot I began using pacmatic at some point, change back to pacman if not using pacmatic: s/pacmatic/pacman/g
#!/bin/sh
howto()
{
echo $1
echo '
Usage: repo [ACTION]<REPOSITORY> <options> <target>
ACTION: One of [sirunfcol] for Search, Install, Remove, Update,
iNformation, Files, Clean, Owner or List(by size)
REPOSITORY: One of [pad] for Pacman or AUR (d for updating devel)
Not specified for remove operation
TARGET: For "s,i,r,n,f" a package name must be supplied, for "o"
a path to a file must be given, "c" takes no target.
If not specified for update, update will apply to both repositories
(not yet implemented).
All additional strings are passed to the command.
Examples:
Search pacman for the term "dialog"
$ repo sp dialog
Install cairo-dock from AUR
$ repo ia cairo-dock
When removing pass "-s" if wishing to remove dependencies as well.
'
}
ACTIONS=("s", "i", "r", "u", "n", "f", "c", "o", "l")
# TLW -- Load pacmatic.
. /usr/bin/pacmatic --as-lib
# --needed PACMAN ONLY, don't re-install if package is already present
# --noedit PACKER ONLY
STDOPTS="--noconfirm"
if [ $# -lt 1 ]; then
howto "Not enough arguments"
exit
fi
# Substring extraction: ${string:position:length}
initial=$1
act=${initial:0:1}
where=${initial:1:1}
shift
what=$*
SU="sudo"
# Search, Install, Remove, Update
if [ "$act" == "s" ]; then
opt="-Ss"
unset SU # Not needed for searching
elif [ "$act" == "i" ]; then
opt="-S"
elif [ "$act" == "r" ]; then
opt="-R"
cmd="pacman"
elif [ "$act" == "u" ]; then
opt="-Syu"
elif [ "$act" == "n" ]; then
cmd="pacman"
opt="-Qi"
unset STDOPTS
unset SU
elif [ "$act" == "o" ]; then
cmd="pacman"
opt="-Qo"
unset STDOPTS
unset SU
elif [ "$act" == "f" ]; then
cmd="pacman"
opt="-Qql"
unset STDOPTS
unset SU
# Remove cached and orphaned packages then exit.
elif [ "$act" == "c" ]; then
sudo paccache -rv -k 2
sudo pacman -Rns $(pacman -Qtdq)
exit
# Show list of packages sorted by size.
elif [ "$act" == "l" ]; then
expac '%m\t%n' | sort -h
exit
else
howto "$act is an invalid option"
exit
fi
# Some commands don't require specifying this.
if [ -z $cmd ]; then
# Pacman or Packer?
if [ "$where" == "p" ]; then
#cmd="pacman"
cmd="pacmatic"
elif [ "$where" == "a" ]; then
unset SU
cmd="packer"
elif [ "$where" == "d" ] && [ "$act" == "u" ]; then
cmd="packer"
opt="$opt --devel"
# Turn off "noconfirm" for development packages.
# This way we can see if they are up to date before
# reinstalling them.
unset STDOPTS
else
howto "Invalid repository \"$where\" specified"
exit
fi
fi
#echo "$SU $cmd $STDOPTS $opt $what"
$SU $cmd $STDOPTS $opt $what
Last edited by theodoreward (2014-07-09 06:42:30)
Offline
Zebra striping terminal output
#!/bin/bash
if [[ -t 1 ]]; then
cols=$(tput cols)
# apply zebra striping
for ((r=0;;r=1-r)); do
IFS='' read -r line || break
(( r )) && printf '\x1b[40m'
printf "%-${cols}s\n" "${line:0:$cols}" # trim or pad
(( r )) && printf '\x1b[m'
done
else
cat
fi
# vim:ts=2:sw=2:et:
feed any text to its standard input and see for yourself
This silver ladybug at line 28...
Offline
Zebra striping terminal output
#!/bin/bash if [[ -t 1 ]]; then cols=$(tput cols) # apply zebra striping for ((r=0;;r=1-r)); do IFS='' read -r line || break (( r )) && printf '\x1b[40m' printf "%-${cols}s\n" "${line:0:$cols}" # trim or pad (( r )) && printf '\x1b[m' done else cat fi # vim:ts=2:sw=2:et:
feed any text to its standard input and see for yourself
It's not working for me
I'm using rxvt-unicode (256 color)
My: [ GitHub | AUR Packages ]
Offline
Run
for i in {1..9}; do echo $i; done | ./<zebra script>
Offline
Run
for i in {1..9}; do echo $i; done | ./<zebra script>
Same output as without the script. I've found it works in vte3 based terminals at least (tilda). Wonder why urxvt doesnt like it
My: [ GitHub | AUR Packages ]
Offline
It works on my urxvt.
Tweak the '\x1b[40m', change it to e.g. '\x1b[35m'.
Offline
Yeah, you may want to change the color codes to suit your colorscheme. Using color 0 as bg looks good if your colorscheme is Solarized Dark.
The color codes are pretty standard, so should work in most terminals I believe. Maybe using `tput` would be more portable? And also, you can specify RGB values directly if your terminal supports true colors https://gist.github.com/XVilka/8346728
EDIT: a sure fire way to see the effect is to reverse the color, so instead of \x1b[40m, use \x1b[7m
Last edited by lolilolicon (2014-07-10 00:19:30)
This silver ladybug at line 28...
Offline
Not really handy, but I find this funny:
ponysay -f $(curl pkgbuild.com 2> /dev/null | grep '<title>' | cut -d '>' -f 2 | cut -d '<' -f 1) 'OBEY!'
Last edited by mid-kid (2014-07-18 09:11:00)
If it ain't broke, you haven't tweaked it enough.
Offline
ponysay should come with Surgeon General's warning ...
http://www.reddit.com/r/commandline/com … tils_2040/
I found csplit pretty useful, but I had to un-escape the '^':
csplit -f foo-part. foo.txt '/^\[.*\]$/' '{*}'
Offline
#!/usr/bin/awk -f
# print uptime for tmux
BEGIN {
while ("uptime" | getline)
gsub(/,/,"")
if (NF==10)
print $3
else if (NF==11)
print $3,$4
else if (NF==12)
print $3,$4,$5
else
print $3,$4,$5,$6
close("uptime")
}
# vim:set ts=2 sts=2 sw=2 et:
Offline
I've never muched like the mutt-sidebar patches. I only have a couple folders/mailboxes I use frequenty, and for a long time I have been looking for a mutt-tabbed patch where a few important mailboxes or folders will have tabs and keybindings.
The bindings are easy - but then I realized I could expand the xtitle script I already use to display a "tab bar" in the status bar. So here you have Mutt tabbed:
# muttrc exccerpts:
set status_format="/home/username/.mutt/xtitle '%f %> [%n new / %m total] ' |"
macro index <f1> "c=INBOX<return>" "change to inbox"
macro index <f2> "c=INBOX.other<return>" "change to other"
macro index <f3> "c=INBOX.Sent<return>" "change to sent"
macro index <f4> "c=../other_account/INBOX<return>" "change to other_account"
#!/bin/bash
# /home/username/.mutt/xtitle
_in="${1/=/}"
_box="${_in%% *}"
_num="[${_in##*[}"
_len=$(( ${#_in} - ${#_num} ))
case $_box in
INBOX)
mbox="Inbox"
str="[ F1: Inbox ] F2: Storage F3: Sent F4: Acnt Name "
;;
INBOX.other)
mbox="Storage"
str=" F1: Inbox [ F2: Storage ] F3: Sent F4: Acnt Name "
;;
INBOX.Sent)
mbox="Sent"
str=" F1: Inbox F2: Storage [ F3: Sent ] F4: Acnt Name "
;;
*)
mbox="Other Account"
str=" F1: Inbox F2: Storage F3: Sent [ F4: Acnt Name ]"
;;
esac
printf "\033]0;Mutt: $mbox\007" > /dev/tty
printf "%-*s %s" "$_len" "$str" "$_num"
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
Here's an RPG dice rolling script a friend and I made [Python 2.7]. I'm still pretty new to the programming world, so any feedback would be greatly appreciated.
Choose the number of dice to roll
Choose the number of sides on each die
Roll the same type (number of sides) dice at once
Split roll with assorted combination of dice types
#!/bin/python2.7
# RPG Dice Roller
# by grandtheftjiujitsu & Senglis3
import random
diff_dice = raw_input("Do all the dice you want to roll have the same number of sides? (y/n) ")
if diff_dice == "Y" or diff_dice == "y":
dice = input("Enter the number of dice: ")
sides = input("Enter number of sides on each die: ")
def roll():
result = random.randint(1,sides)
print result
count = 0
while count < dice:
roll()
count = count + 1
elif diff_dice == "N" or diff_dice == "n":
dice4 = input("Number of 4-sided die: ")
dice6 = input("Number of 6-sided die: ")
dice8 = input("Number of 8-sided die: ")
dice10 = input("Number of 10-sided die: ")
dice12 = input("Number of 12-sided die: ")
dice20 = input("Number of 20-sided die: ")
def multi_dice():
dice4list = []
dice6list = []
dice8list = []
dice10list = []
dice12list = []
dice20list = []
if dice4 == 0:
pass
else:
for x in range(0, dice4):
term1 = random.randint(1,4)
dice4list.append(term1)
print "4-sided Die Results: %s" % (dice4list)
if dice6 == 0:
pass
else:
for x in range(0, dice6):
term2 = random.randint(1,6)
dice6list.append(term2)
print "6-sided Die Results: %s" % (dice6list)
if dice8 == 0:
pass
else:
for x in range(0, dice8):
term3 = random.randint(1,8)
dice8list.append(term3)
print "8-sided Die Results: %s" % (dice8list)
if dice10 == 0:
pass
else:
for x in range(0, dice10):
term4 = random.randint(1,10)
dice10list.append(term4)
print "10-sided Die Results: %s" % (dice10list)
if dice12 == 0:
pass
else:
for x in range(0, dice12):
term5 = random.randint(1,12)
dice12list.append(term5)
print "12-sided Die Results: %s" % (dice12list)
if dice20 == 0:
pass
else:
for x in range(0, dice20):
term6 = random.randint(1,20)
dice20list.append(term6)
print "20-sided Die Results: %s" % (dice20list)
multi_dice()
else:
quit()
Last edited by grandtheftjiujitsu (2014-07-30 02:42:41)
Offline
Script to colourise the output from the ocaml compiler. Errors and warnings get highlighted, so I can easily locate them when I scroll back up the cascade of compiler output. I know I could just use make -s, but sometimes I do want all the output but with the interesting bits highlighted.
make $@ | sed \
-e "s\
/File \"\(.*\)\"\
/File \"$(tput setab 2)$(tput setaf 8)\1$(tput sgr0)\"\
/g" -e "s\
/, line \([0-9]*\)\
/, line $(tput setab 2)$(tput setaf 8)\1$(tput sgr0)\
/g" -e "s\
/, characters \([0-9]*\)-\([0-9]*\):\
/, characters $(tput setab 2)$(tput setaf 8)\1$(tput sgr0)-\
$(tput setab 2)$(tput setaf 8)\2$(tput sgr0):\
/g" -e "s\
/Error:\(.*\)\
/$(tput setab 1)$(tput setaf 8)Error$(tput sgr0)$(tput setaf 1):\1$(tput sgr 0)\
/g" -e "s\
/Warning\(.*\)\
/$(tput setab 3)$(tput setaf 8)Warning\1$(tput sgr 0)\
/g"
I am aware that this is hideous, I am a newb at sed.
One day I will write a more general program that can handle the outputs of different compilers, if such a thing doesn't already exist.
Offline
Script to colourise the output from the ocaml compiler. Errors and warnings get highlighted, so I can easily locate them when I scroll back up the cascade of compiler output. I know I could just use make -s, but sometimes I do want all the output but with the interesting bits highlighted.
http://s28.postimg.org/vly2w6xq1/2014_08_11_201221_4480x2224_scrot.jpg
make $@ | sed \ -e "s\ /File \"\(.*\)\"\ /File \"$(tput setab 2)$(tput setaf 8)\1$(tput sgr0)\"\ /g" -e "s\ /, line \([0-9]*\)\ /, line $(tput setab 2)$(tput setaf 8)\1$(tput sgr0)\ /g" -e "s\ /, characters \([0-9]*\)-\([0-9]*\):\ /, characters $(tput setab 2)$(tput setaf 8)\1$(tput sgr0)-\ $(tput setab 2)$(tput setaf 8)\2$(tput sgr0):\ /g" -e "s\ /Error:\(.*\)\ /$(tput setab 1)$(tput setaf 8)Error$(tput sgr0)$(tput setaf 1):\1$(tput sgr 0)\ /g" -e "s\ /Warning\(.*\)\ /$(tput setab 3)$(tput setaf 8)Warning\1$(tput sgr 0)\ /g"
I am aware that this is hideous, I am a newb at sed.
One day I will write a more general program that can handle the outputs of different compilers, if such a thing doesn't already exist.
I'll not got through the script, but I will point out one thing.
You don't need all those -e options.
make $@ | sed 'all the commands go in here'
The '...' can include newlines, so you can put each command on a separate line, and comments are allowed:
make $@ | sed '
# describe cmd1
cmd1
# describe cmd2
cmd2
# describe cmd3
cmd3
...
# describe cmdn
cmdn'
With the version of sed that comes with Arch (I'm not sure how portable this, so be aware), you can use other separator chars in the commands:
sed 's|findwith\init|replacewith\init|g'
The first char after the command is the one sed assumes to be the separator.
Finally to embed shell variables (should you wish), you just break the '...':
make $@ | sed 's/'$FIND'/'$REPLACE/'
Hopefully, this should make the code much more readable.
If you want to write a more generalised program, you can have multiple files containing the sed commands (say, one for each compiler) and reference those.
"...one cannot be angry when one looks at a penguin." - John Ruskin
"Life in general is a bit shit, and so too is the internet. And that's all there is." - scepticisle
Offline
I'll not got through the script, but I will point out one thing.
Thanks for all the tips!
When I write a more general version, I doubt it will be just sed and bash though, I'll probably use a heavier scripting language. It would be nice, for example, to autodetect the compiler that is being used, and use that information to colourise the output accordingly.
For compilers that don't output an informational string when you invoke them, before the compiler output proper, I would just let the user specify the name of the ocmpiler as a command line argument or whatever.
Offline
Finally to embed shell variables (should you wish), you just break the '...':
make $@ | sed 's/'$FIND'/'$REPLACE/'
Isn't this missing a single quote, one before the last forward slash, like
make $@ | sed 's/'$FIND'/'$REPLACE'/'
Offline
Before a potentially risky upgrade, I use these 3 LVM aliases to take a snapshot, remove the snapshot (if things go well), or revert back to the snapshot (if things go poorly).
alias mksnap='sudo lvcreate -s /dev/caprica_vg/root -L 200G -n snappy'
alias rmsnap='sudo lvremove /dev/caprica_vg/snappy'
alias snapback='sudo lvconvert --merge /dev/caprica_vg/snappy'
Change the logical volume path to meet your needs. Obviously, this only works if you use LVM for your root filesystem. I also stick this near the end of my ~/.bashrc to remind me when I have a snapshot open.
# warn if there's a backup snapshot in use
if [ -e /dev/caprica_vg/snappy ]; then
echo 'LVM snapshot "snappy" exists. Are you done with it yet?'
fi
Offline
A small script for use after "photorec" to sort recovered files based on extension and remove recup.dir* directories:
/usr/bin/recup
#!/usr/bin/bash
if [ $(basename $PWD) != recup ]; then
echo \
"Please cd into recup"; exit
fi
direct=$(find . -type f -exec basename {} \; | grep -Po '[[:alnum:]]*(?=$)' | sort -u)
mkdir $direct
for i in $direct; do
mv **/*$i $i
done
rmdir *
chown -R aaron:users .
note: photorec must have dumped files into a directory named "recup"
Last edited by KyleBytes (2014-08-21 09:13:18)
Offline
The most unefficient way to update my PKGBUILD/src files...
#/usr/bin/env sh
for i in $HOME/Proyectos/Jristz/PKGBUILD/*
do
cd "$i"
makepkg -sc -d --nobuild -e --verifysource
cd $HOME/Proyectos/Jristz/PKGBUILD
done
concidering that was my first atempt to try do a script since I start using Arch... 4 years ago... I think I need a more bashing life
Well, I suppose that this is somekind of signature, no?
Offline
I just wrote this script so that if I change my terminal colorscheme, I can keep up with it in my various configs by running only a single command. I chose python, so I could learn a little something along the way, though I think this would've been a bit easier in *sh.
You can view an example directory with a paths file and some config files @ my github: https://github.com/Theta91/dotfiles/tre … ncolorized
#!/usr/bin/env python3
"""This script colorizes a config file with uncolorized placeholders based on the
result of 'xrdb -query'. It requires a file (in this example, 'paths.txt') with
pairs of filenames and the full path of where they should should be placed,
separated by an '='. For example:
xmonad.hs=/home/user/.xmonad/xmonad.hs
The uncolorized files must be in the same directory as 'paths.txt'.
This scripts assumes that you've set your colors as '*color0: #a-f0-9', i.e.
lowercase. It supports the standard 16 ANSI colors; bright colors are prefixed
with 'b'. Complete list of values available for substitution:
$fg $bg
$black $red $green $yellow $blue $magenta $cyan $white
$bblack $bred $bgreen $byellow $bblue $bmagenta $bcyan $bwhite
"""
import argparse
import os
import re
import subprocess
import sys
def retrieveColors():
xrdb = subprocess.check_output(['xrdb', '-query']).decode('utf-8')
xrdb = xrdb.replace('\t', '')
xrdb = re.sub(r'\*\.', '', xrdb)
xrdb = re.findall(r'(?:background|color[\d]+|foreground):#[\da-z]{6}', xrdb)
xrdb = [x.split(':') for x in xrdb]
i = iter(xrdb)
colors = dict(i)
return colors
def retrieveFilePaths():
with open(sys.argv[1]) as f:
parentDir, whoCares = os.path.split(sys.argv[1])
fileList = dict(x.strip().split('=', 1) for x in f if x.strip())
source = []
dest = []
for k, v in fileList.items():
source.append(os.path.join(parentDir, k))
dest.append(v)
return source, dest
def colorSubstitution(colors, contents):
contents = contents.replace('$fg', colors['foreground'])
contents = contents.replace('$bg', colors['background'])
contents = contents.replace('$black', colors['color0'])
contents = contents.replace('$red', colors['color1'])
contents = contents.replace('$green', colors['color2'])
contents = contents.replace('$yellow', colors['color3'])
contents = contents.replace('$blue', colors['color4'])
contents = contents.replace('$magenta', colors['color5'])
contents = contents.replace('$cyan', colors['color6'])
contents = contents.replace('$white', colors['color7'])
contents = contents.replace('$bblack', colors['color8'])
contents = contents.replace('$bred', colors['color9'])
contents = contents.replace('$bgreen', colors['color10'])
contents = contents.replace('$byellow', colors['color11'])
contents = contents.replace('$bblue', colors['color12'])
contents = contents.replace('$bmagenta', colors['color13'])
contents = contents.replace('$bcyan', colors['color14'])
contents = contents.replace('$bwhite', colors['color15'])
return contents
if __name__ == "__main__":
parser = argparse.ArgumentParser(description=__doc__, formatter_class = argparse.RawDescriptionHelpFormatter)
parser.add_argument('/path/to/paths.txt')
args = parser.parse_args()
colors = retrieveColors()
source, dest = retrieveFilePaths()
for i in range(len(source)):
with open(source[i], 'r') as f:
sourceContents = f.read()
destContents = colorSubstitution(colors, sourceContents)
with open(dest[i], 'w') as f:
f.write(destContents)
sys.exit(0)
edit: updated to teach myself a little argparse
Last edited by Theta91 (2014-08-25 23:20:23)
Offline
The most unefficient way to update my PKGBUILD/src files...
#/usr/bin/env sh for i in $HOME/Proyectos/Jristz/PKGBUILD/* do cd "$i" makepkg -sc -d --nobuild -e --verifysource cd $HOME/Proyectos/Jristz/PKGBUILD done
concidering that was my first atempt to try do a script since I start using Arch... 4 years ago... I think I need a more bashing life
Let me jump start your bashing life by bashing your script
First, you are missing a bang (!) after the hash (#).
Second, since you are using bash, don't invoke the script as sh.
Last edited by x33a (2014-08-25 11:15:38)
Offline
Could very well perform poorly on v. large directories, but aside from that:
#!/usr/bin/env python3
"""Small wrapper for sxiv that opens all images in a directory. Input can be
either an image (in which case sxiv will open to it) or a directory (in which
case sxiv will open to the first image in the directory).
This script is a modification of loop's python replacement for rifle_sxiv.sh:
https://bbs.archlinux.org/viewtopic.php?pid=1232114#p1232114
"""
from os import listdir
from os import path
from re import search
from sys import argv
from subprocess import Popen
if path.isdir(path.abspath(argv[1])):
dirname = path.abspath(argv[1])
else:
dirname, basename = path.split(path.abspath(argv[1]))
images = [f for f in listdir(dirname) if search(r'.*.(png|jpg|jpeg|jpe|gif)$', f)]
images.sort(key=str.lower)
try:
count = str(images.index(basename) + 1)
except NameError:
count = str(1)
images = [path.join(dirname, f) for f in images]
Popen(['sxiv', '-afqn', count] + images)
Last edited by Theta91 (2014-08-27 05:11:19)
Offline
I am using sxiv v1.1.1, how does this differ from:
'-r Search the given directories recursively for images to view.' ?
Offline