Sida 4 av 5
Re: Dela med dig av dina egna script/*sh-tips
Postat: 14 maj 2009, 04:35
av dmz
Allright. Jag trodde att eftersom >> appendar så skapar den heller ingen fil om målfilen inte existerar. Antar att det står någon notis om detta i dokumentationen dock.
Re: Dela med dig av dina egna script/*sh-tips
Postat: 14 maj 2009, 04:41
av Harlekin33
Detta är inte mitt eget men..
http://pin.ic.cz/Water.lua
Re: Dela med dig av dina egna script/*sh-tips
Postat: 14 maj 2009, 05:40
av dmz
Du får gärna tala om vad det är bra för också.

Re: Dela med dig av dina egna script/*sh-tips
Postat: 14 maj 2009, 07:54
av Harlekin33
dmz skrev:
Du får gärna tala om vad det är bra för också.

Det har med OpenGL shaders att göra..
Hitta det här:
http://www.youtube.com/watch?v=u9qVPpeK ... re=related
Kolla i övre högra hörnet..(i boxen alltså)
Re: Dela med dig av dina egna script/*sh-tips
Postat: 14 maj 2009, 10:22
av Konservburk
dmz skrev:Allright. Jag trodde att eftersom >> appendar så skapar den heller ingen fil om målfilen inte existerar. Antar att det står någon notis om detta i dokumentationen dock.
sh-manualblad från tidigt 70-tal:
Kod: Markera allt
An argument of the form ">>arg" causes file "arg" to be
used as the standard output for the given command. If
"arg" did not exist, it is created; if it did exist, the
command output is appended to the file.
man zshmisc:
Kod: Markera allt
>> word
Open file word for writing in append mode as standard output.
If the file does not exist, and the CLOBBER option is unset,
this causes an error; otherwise, the file is created.
>>| word
>>! word
Same as >>, except that the file is created if it does not
exist, even if CLOBBER is unset.
Du kan tydligen använda
>>| eller
>>! om du vill att det ska fungera oavsett vilken CLOBBER-inställning du har. Men var medveten om att det är väldigt zsh-specifikt.
Re: Dela med dig av dina egna script/*sh-tips
Postat: 14 maj 2009, 10:28
av dmz
Tack!
Re: Dela med dig av dina egna script/*sh-tips
Postat: 21 maj 2009, 15:57
av bbauto
Ett litet Nautilus script:
Kod: Markera allt
#!/bin/bash
#Nautilus script Rename with prefixsuffix
base="`echo $NAUTILUS_SCRIPT_CURRENT_URI | cut -d'/' -f3- | sed 's/%20/ /g'`"
if [ -z "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" ]; then
dir="$base"
else
while [ ! -z "$1" -a ! -d "$base/$1" ]; do shift; done
dir="$base/$1"
fi
if test -f "$dir/.rename_tmp/.exists"
then
echo "Exists!"
else
mkdir "$dir/.rename_tmp"
touch "$dir/.rename_tmp/.exists"
fi
IFS='
'
for file in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do
if [ -f "$file" ]; then
cp $file "$dir/.rename_tmp/"
fi
done
cd "$dir/.rename_tmp"
prefixsuffix $@
for file in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do
if [ -f "$file" ]; then
rm $file
fi
done
mvfiles="$dir/.rename_tmp/*"
mv $mvfiles "$dir/"
rm "$dir/.rename_tmp/.exists"
rmdir "$dir/.rename_tmp"
Installera prefixsuffix från förråden...
PS! Sökvägen uppdateras inte som den ska förs man väljer Folder path: Choose->Select
prefixsuffix har visat sig ha sina begränsningar, så gjort en liknande för pyrenamer...
PyRenamer:
Kod: Markera allt
#!/bin/bash
#Nautilus script Rename with pyrenamer
base="`echo $NAUTILUS_SCRIPT_CURRENT_URI | cut -d'/' -f3- | sed 's/%20/ /g'`"
if [ -z "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" ]; then
dir="$base"
else
while [ ! -z "$1" -a ! -d "$base/$1" ]; do shift; done
dir="$base/$1"
fi
if test -f "$dir/.rename_tmp/.exists"
then
echo "Exists!"
else
mkdir "$dir/.rename_tmp"
touch "$dir/.rename_tmp/.exists"
fi
IFS='
'
for file in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do
if [ -f "$file" ]; then
cp $file "$dir/.rename_tmp/"
fi
done
pydir="$dir.rename_tmp"
pyrenamer -r "$pydir"
for file in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do
if [ -f "$file" ]; then
rm $file
fi
done
mvfiles="$dir/.rename_tmp/*"
mv $mvfiles "$dir/"
rm "$dir/.rename_tmp/.exists"
rmdir "$dir/.rename_tmp"
Re: Dela med dig av dina egna script/*sh-tips
Postat: 21 maj 2009, 16:01
av bbauto
Ytterligare Nautilus script (ChgOwner):
Kod: Markera allt
#!/bin/sh
# Change Owner and Group to Read & Write recursively from current dir.
# Replace root:admin if you wish (NewOwner:NewGroup)
base=”`echo $NAUTILUS_SCRIPT_CURRENT_URI | cut -d’/’ -f3- | sed ’s/%20/ /g’`”
if [ -z "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" ]; then
dir=”$base”
else
while [ ! -z "$1" -a ! -d "$base/$1" ]; do shift; done
dir=”$base/$1″
fi
cd "$dir"
foo=`gksudo -u root -k -m "enter your password for nautilus root access" /bin/echo "got r00t?"`
sudo chown --recursive root:admin ./
foo=`gksudo -u root -k -m "enter your password for nautilus root access" /bin/echo "got r00t?"`
sudo chmod --recursive 770 ./
Re: Dela med dig av dina egna script/*sh-tips
Postat: 21 maj 2009, 16:09
av bbauto
Jag jobbar mycket med Postscript utskrifter från olika CAD-program, oftast till ett spooler directory... sen kopierar jag alla *.PS -> Projektnamn.PS
och avslutar sedan med denna script, för att slutligen göra hela ritningssatser till PDF-format.
Kod: Markera allt
#!/bin/bash
#created by bbauto
IFS='
'
for file in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do
if [ -f "$file" ]; then
base=${file%.*}
newname=${base}.pdf
ps2pdf $file $newname
cp $newname /home/bengtb/Skrivbord/PS-PDF
# rm $newname
rm $file
fi
done
Re: Dela med dig av dina egna script/*sh-tips
Postat: 09 apr 2010, 08:36
av dmz
clftail
Tailer för Common Log Format (apache, lighttpd osv) som gör det lite lättare att se vad som försigår på webservern, i realtid.
Kod: Markera allt
#!/usr/bin/perl
use strict;
use File::Tail;
my $log = shift;
my $line = "";
my $tail = File::Tail->new(name=>$log,
maxinterval=>3,
adjustafter=>3,
interval=>0,
tail=>100
);
while(defined($line=$tail->read)) {
my $e = "(.+?)";
$line =~ /^$e $e $e \[$e:$e $e\] "$e $e $e" $e $e/;
my $ip = $1;
my $ref = $2;
my $name = $3;
my $date = $4;
my $time = $5;
my $gmt = $6;
my $request = $7;
my $file = $8;
my $ptcl = $9;
my $code = $10;
my $size = $11;
$code = "\033[38;5;240m$code\033[0m" if $code == 404;
$code = "\033[38;5;155m$code\033[0m" if $code == 200;
$code = "\033[38;5;160m$code\033[0m" if $code == 501;
$code = "\033[38;5;208m$code\033[0m" if $code == 301;
$code = "\033[38;5;124m$code\033[0m" if $code == 403;
$code = "\033[38;5;113m$code\033[0m" if $code == 304;
$file = "" if $file =~ /^\/$/;
$file = "\033[38;5;160m$file\033[0m" if $file !~ /([A-Za-z0-9])+/;
$size = "\033[38;5;160m$size\033[0m" if $size > 5;
printf("%s %7s %s %s %60s\n",
$code, $request, $size, $ip, $file);
}
mail
Det var aningens lurigt att lista ut hur msmtp ville att man skulle specificera mottagare, subject och body, så jag skrev en wrapper runt det för att slippa glömma bort någon mer gång.
Kod: Markera allt
#!/usr/bin/perl
use strict;
#mail
use Getopt::Long;
&interactive if !@ARGV;
our $opt_stdin;
GetOptions(stdin => \$opt_stdin);
my @details = @ARGV;
my $acc = "gmail";
my $def_Rec = "trapd00r\@trapd00r.se";
&readStdin if $opt_stdin;
sub readStdin {
my @body;
while(<>) {
push(@body, $_);
}
my $body = join/\n/, @body;
my $rec = $def_Rec;
my $subject = 'stdin';
my $content = sprintf("Subject:$subject\n\n$body\n");
system("printf \"$content\"|msmtp -a $acc \"$def_Rec\"");
print "Status: $?\n";
exit 0;
}
sub mail {
my ($subject, $body, $rec) = @_;
$rec = "foo\@bar.com" unless $rec;
my $content = sprintf("Subject:$subject\n\n$body\n");
system("printf \"$content\"|msmtp -a $acc \"$rec\"");
print "Status: $?\n";
}
&mail(@details);
sub interactive {
print "Subject: ";
my $subject = <STDIN>;
print "Body: ";
my $body = <STDIN>;
print "Mail: ";
my $rec = <STDIN>;
chomp($subject,$body,$rec);
my $content = sprintf("Subject:$subject\n$body\n");
system("printf \"$content\"|msmtp -a $acc \"$rec\"");
print "Status: $?\n";
}
unpack
Packar upp film till /mnt/$disk/.temp, spelar den och tar bort den uppackade filmen efteråt. Håller reda på vilka filmer som är sedda.
Kod: Markera allt
#!/bin/sh
# unpack script
chmod 777 $(pwd)
find . -iname '*.rar' -execdir rar x {} $(pwd | perl -pe 's/^((?:\/[^\/]+){2}\/).*/$1/').temp/ \;
mplayer -slave -input file=/home/scp1/.mplayer/fifo $(pwd | perl -pe 's/^((?:\/[^\/]+){2}\/).*/$1/').temp/* && rm $(pwd | perl -pe 's/^((?:\/[^\/]+){2}\/).*/$1/').temp/*
# keep track of what I've seen
echo $(basename $(pwd)) >> /mnt/Movies_1/.seen
Bara ett proof of concept; Jag upptäckte nyss att man kan styra mplayer genom FIFOs. Otroligt användbart.
Kod: Markera allt
#!/usr/bin/perl
use strict;
my $fifo = "/home/scp1/.mplayer/fifo";
my %commands = ('fs' => 'vo_fullscreen',
'stop' => 'stop',
'pause' => 'pause',
'soff' => 'mute 1',
'son' => 'mute 0',
'fstep' => 'frame_step',
'osd' => 'osd',
);
if(!@ARGV) {
foreach my $choice(sort(keys(%commands))) {
printf("%6s %s\n", $choice, $commands{$choice});
}
}
my $cmd = shift;
&talk($commands{$cmd});
sub talk {
my $cmd = shift;
open(FIFO,'>',$fifo) or die $!;
print FIFO $cmd, "\n";
close(FIFO);
}
mpdmon-full
Monitor för mpd med history, när sång byts så notifieras vi.
Kod: Markera allt
#!/usr/bin/perl
use strict;
use Audio::MPD;
use List::Util qw(shuffle);
my $mpd = Audio::MPD->new;
sub monitor {
my $np = "";
my @c;
for(my $i=0;$i<256;$i++) {
push(@c, "\033[38;5;$i"."m");
}
while(1) {
my $current = $mpd->current;
my $output = $mpd->current->file;
if(!$current) {
$current = $c[1].'undef'.$c[0];
$output = $current;
}
my $time1 = $mpd->status->time->sofar;
my $time2 = $mpd->status->time->total;
my @date = localtime(time);
if("$np" ne "$current") {
$np = $current;
my @rc = shuffle(@c);
printf("%02s:%02s:%02s▕ $rc[0]%s$c[0]\n",
$date[2], $date[0], $date[1], $output);
}
sleep 2;
}
}
&monitor;
mpdmon-rt
Samma sak här, men vi uppdaterar en och samma rad hela tiden, vilket gör det perfekt för conky, dzen, hardstatus i screen eller liknande.
Kod: Markera allt
#!/usr/bin/perl
use strict;
use Audio::MPD;
my $mpd = Audio::MPD->new;
sub monitor {
my $np = "";
while(1) {
my $current = $mpd->current;
my $output;
if(!$current) {
$output = 'undef';
$current = 'undef';
}
else {
$output = $mpd->current->artist . ' - ' .
$mpd->current->album . ' - ' .
$mpd->current->title;
}
my $time1 = $mpd->status->time->sofar;
my $time2 = $mpd->status->time->total;
$| = 1;
printf(" [%s/%s]\r", $time1, $time2);
if("$np" ne "$current") {
$np = $current;
printf("\t\t%s\r", $output);
}
sleep 1;
}
}
&monitor;
colortest-256-ng
Inspirerad av http://www.vim.org/scripts/script.php?script_id=1349 så tänkte jag att jag kunde göra det lite snyggare. Helt otroligt att han verkar ha suttit och skrivit alla escapesekvenser för hand.
Kod: Markera allt
#!/usr/bin/perl
# colortest-256-ng
# prints table of available colors for terminals supporting 256 colors
# optionally takes arbitary input and colors it randomly
use strict;
use Getopt::Long;
use List::Util qw(shuffle);
my %colors;
for(my $i=0;$i<256;$i++) {
$i = sprintf("%03s", $i);
my $escaped_escape = "\\033[38;5;$i".'m';
$colors{$escaped_escape} = "\033[38;5;$i".'m';
}
if(!@ARGV) {
foreach my $str(sort(keys(%colors))) {
print "$str $colors{$str}\n";
}
print "\033[0m\n";
print << "USAGE";
USAGE: $0 [-c <cmd>]
EXAMPLES
ls|./$0 -c
./$0 -c file
dmesg|./$0
USAGE
exit 0;
}
GetOptions('cmd' => \&cmd,
);
sub cmd {
while(<>) {
my @colors = values %colors;
@colors = shuffle(@colors);
my @seen;
my $i = 0;
push(@seen, $colors[$i]);
if($colors[0] ~~ @seen) {
$i++;
print $colors[0], $_;
}
}
}
Slutligen så tyckte jag att
http://en.wikipedia.org/wiki/Collatz_conjecture var intressant, så jag löste den;
Kod: Markera allt
#!/usr/bin/perl
$i=shift;while($i>1){if($i%2==0){$i=$i/2;}else{$i=$i*3+1;}print"$i\n";}
Re: Dela med dig av dina bästa shell-tips
Postat: 09 apr 2010, 10:52
av SlamsornasKung
David Andersson skrev:Se de nyaste/senast ändrade filerna i aktuell katalog:
Hej!
Hundra år försent, men i alla fall...
Koden ovan är faktiskt lite felaktig. Den sorterar ”reversed”, med andra ord hamnar de SENAST ändrade filerna SIST, det är väl snarare så att du vill se de senast ändrade filerna FÖRST.
Om du istället kör:
ls -Alt eller föralldel bara
ls -lt så visas de senast ändrade filerna FÖRST (överst) i listan. Personligen lägger jag dessutom till
| head -10 så att jag ser de tio senast ändrade filerna, alltså:
Tjing!
PS. Vad tycks Obi-Wan ;-) DS.
SK
Re: Dela med dig av dina bästa shell-tips
Postat: 09 apr 2010, 11:02
av Konservburk
SlamsornasKung skrev:Koden ovan är faktiskt lite felaktig. Den sorterar ”reversed”, med andra ord hamnar de SENAST ändrade filerna SIST, det är väl snarare så att du vill se de senast ändrade filerna FÖRST.
Det är nog meningen ska du se. På det kan man enkelt och snabbt se de senast ändrade filerna direkt utan att behöva scrolla upp en massa och man slipper dessutom pipe:a vidare till
less eller
more eller för den delen
head.
Re: Dela med dig av dina bästa shell-tips
Postat: 09 apr 2010, 11:05
av Osprey
Konservburk skrev:SlamsornasKung skrev:Koden ovan är faktiskt lite felaktig. Den sorterar ”reversed”, med andra ord hamnar de SENAST ändrade filerna SIST, det är väl snarare så att du vill se de senast ändrade filerna FÖRST.
Det är nog meningen ska du se. På det kan man enkelt och snabbt se de senast ändrade filerna direkt utan att behöva scrolla upp en massa och man slipper dessutom pipe:a vidare till
less eller
more eller för den delen
head.
Tror också att det är meningen, jag använder ofta "-ltr" själv och r:et just för att då slipper jag att scrolla för att hitta senaste filen och den hamnar närmast prompten, där jag ändå har blicken fäst så att säga...
Re: Dela med dig av dina bästa shell-tips
Postat: 09 apr 2010, 11:18
av dmz
SlamsornasKung skrev:
Personligen lägger jag dessutom till | head -10
Du kan skippa -10, det är default.

Värt att notera är att -r till ls fungerar på i princip allting, mycket smidigt.
Re: Dela med dig av dina egna script/*sh-tips
Postat: 09 apr 2010, 11:37
av Harlekin33
BRA jobbat där dmz, så ska det se ut!

Re: Dela med dig av dina bästa shell-tips
Postat: 09 apr 2010, 11:39
av Konservburk
dmz skrev:Värt att notera är att -r till ls fungerar på i princip allting, mycket smidigt.
Undantaget är väl
-U då, men just den kombinationen är ju ändå inte vettig.
Re: Dela med dig av dina egna script/*sh-tips
Postat: 12 apr 2010, 17:28
av BadOmen
Här kommer ett litet Nautilus script som gör att man kan skapa en kopia av en fil i samma mapp som man befinner sig i, man får möjligheten att döpa den till vad man vill.
Kod: Markera allt
#!/bin/bash
# This script makes it easy to make a duplicate of a file in the same directory.
# It lets you choose a name for the new file and then it makes the copy with the new name.
# $1 Is the selected file
if [[ -f "$1" ]]; then # True if FILE exists and is a regular file.
selectedFile="$1"
backupname=$(zenity --text="Skriv in backup namnet för filen." --entry-text="$selectedFile" --entry)
if [[ $? == 0 ]]; then # True if previos command exicutet correctly.
if [[ -n "$backupname" ]]; then # True if the length of "STRING" is non-zero.
if [[ -a "$backupname" ]]; then # True if FILE exists.
if zenity --question --ok-label=JA --cancel-label=NEJ --text="Filen $backupname finns redan, vill du skriva över den?"; then
if [[ -w "$backupname" ]]; then # True if FILE exists and is writable.
cp "$1" "$backupname"
if [[ $? == 0 ]] ; then # True if previos command exicutet correctly.
zenity --info --text "Backupen är nu klar, filen $backupname har skapats."
else
zenity --info --text "Backupen misslyckades, kanske har du inte skrivrättigheter här"
fi
else
zenity --info --text "Filen $backupname är skrivskyddad så backupen kunde inte tas."
fi
else
zenity --info --text "Backupen är ej genomförd"
fi
else
cp "$1" "$backupname"
if [[ $? == 0 ]] ; then # True if previos command exicutet correctly.
zenity --info --text "Backupen är nu klar, filen $backupname har skapats."
else
zenity --info --text "Backupen misslyckades, kanske har du inte skrivrättigheter här"
fi
fi
else
zenity --info --text "Backupen är ej genomförd, du namngav inte filen."
fi
else
zenity --info --text "Backupen är ej genomförd"
fi
else
zenity --info --text "Du har inte valt någon fil."
fi
EDIT: Ändrade koden lite så att den även kollar om man har skrivrättigheter, tidigare meddelade den att kopieringen var klar fasten själva kopieringen misslyckades... Nu får man ett felmeddelande om kopieringen misslyckas.
BTW så har jag gjort den här framföralt för att testa zenity och lite -f -a -n (vad de nu kallas), nämnde jag att jag gillar if satser

Re: Dela med dig av dina bästa shell-tips
Postat: 12 apr 2010, 20:07
av SlamsornasKung
Konservburk skrev:SlamsornasKung skrev:Koden ovan är faktiskt lite felaktig. Den sorterar ”reversed”, med andra ord hamnar de SENAST ändrade filerna SIST, det är väl snarare så att du vill se de senast ändrade filerna FÖRST.
Det är nog meningen ska du se. På det kan man enkelt och snabbt se de senast ändrade filerna direkt utan att behöva scrolla upp en massa och man slipper dessutom pipe:a vidare till
less eller
more eller för den delen
head.
Å... då är jag med. Trodde att de senast ändrade filerna skulle hamna överst. My bad!
Re: Dela med dig av dina egna script/*sh-tips
Postat: 14 apr 2010, 08:45
av dmz
Jag har gjort en urklippshanterardaemon med perl, bash och dmenu.
dmenuclip
Själva startar-scriptet för att kicka igång dmenu. Ruskigt fult. Just system()-raden är jag riktigt stolt över, fulare kodstycke har nog aldrig skådats
Kod: Markera allt
#!/usr/bin/perl
# dmenuclip.pl
# REALLY nasty...
use strict;
my $xsels = "/home/scp1/.config/dmenuclip/xsel";
my $f = '-*-fixed-*-*-*-*-15-*-*-*-*-*-*-*';
my $dmenu = 'dmenu -i -b -nb \#1c1c1c -nf \#d7005f -sb \#252525';
system("printf \$(\\cat $xsels|$dmenu -fn $f -p xsel)|xclip -i -l 1|xclip -o");
dmenuclip-syncd
Daemon som ligger i bakgrunden och kontinuterligt samlar in allt som ligger i buffern och skriver det till fil. Det är ifrån denna fil vi sedan hämtar alla urklipp, och väljer det vi vill använda oss av (som då skickas till den primära buffern).
Notera att inga duplicationer förekommer i filen (känns rätt onödigt).
Kod: Markera allt
#!/usr/bin/perl
use strict;
# dmenuclip-syncd - daemon that saves all X selections for use with dmenuclip
use Proc::Daemon;
#use Data::Dumper;
my $xsel = "$ENV{'HOME'}/.config/dmenuclip/xsel";
sub syncIt {
print "Daemonizing...\n";
#Proc::Daemon::Init;
while(1) {
open(XSEL,"<", $xsel) or die "Cant open $xsel for reading: $!";
my @lines = <XSEL>;
chomp @lines;
close XSEL;
my $currentSel = `/usr/bin/xsel -o`;
chomp($currentSel);
$currentSel =~ s/\n/ /g; #temporary (?) fix for the newline hassle
#print Dumper($currentSel);
if($currentSel ~~ @lines) {
&syncSec(0);
}
else {
open(XSEL_W, ">>", $xsel) or die "Cant open $xsel for writing: $!";
print XSEL_W "$currentSel\n";
close XSEL_W;
}
sleep 2;
}
}
&syncIt;
# Those are deprecated, but left here for reference (and the dummy call)
sub syncPrim {
system("/usr/bin/xclip -o --selection primary -o) >> $xsel&&printf \"\n\" >> $xsel");
}
sub syncSec {
my $c = shift;
unless($c == 0) {
system("/usr/bin/xclip -o >> $xsel"); #&& printf \"\n\" >> $xsel");
}
}
Det hela kan se ut så här;

Re: Dela med dig av dina egna script/*sh-tips
Postat: 14 apr 2010, 11:29
av BadOmen
Utanför ämnet: Lite utanför ämnet kanske men jag skulle tycka det var väldigt bra om ni kommenterar lite i er kod så att även man som nybörjare på Bash kan läsa koden och lära sig lite också. Kanske man till och med får för sig att utveckla skripten lite ifall man får mer förståelse för hur de funkar. Kanske det kan inspirera till nya skript med den nyvunna kunskapen.
För övrigt en riktigt trevlig och inspirerande tråd
