Ta bort en nummerserie av filer

[python]
#!/usr/bin/env python

import sys, glob, re, os, getopt

def main (argv):

startMatch=””
fromIndex=-1
toIndex=-1
endMatch=””

options, reminder = getopt.getopt(argv, ’s:f:t:e:’, [’startmatch=’, ’fromindex=’, ’toindex=’, ’endmatch=’])

for opt, arg in options:
if opt in (’-s’, ’–startmatch’):
startMatch = arg
elif opt in (’-f’, ’–fromindex’):
fromIndex = int(arg)
elif opt in (’-t’, ’–toindex’):
toIndex = int(arg)
elif opt in (’-e’, ’–endmatch’):
endMatch = arg

if len(startMatch) > 0 and len(endMatch) > 0 and fromIndex > -1 and toIndex > 0 and fromIndex < toIndex:
files = glob.glob(”*”);
files.sort();

filesInRange = findFilesInRange(files, startMatch, fromIndex, toIndex, endMatch)
anwser = raw_input(”Do you which to delete these files: ” + str(filesInRange) +”?\n\n(y)es or (n)o:”)
if anwser == ”y”:
for file in filesInRange:
os.remove(file)
else:
print ”””
rms.y usage

mandatory parameters –startmatch=, –fromindex=, –toindex=, –endmatch=

example: ~$ rms.py –startmatch=’picture’, –fromindex=3, –toindex=24, –endmatch=’.jpg’
”””
sys.exit()

def isFileInRange (file, fileStartMatch, fromIndex, toIndex, fileEndMatch):
match = re.search(’(’+fileStartMatch+’)([0-9]{1,100})(’+fileEndMatch+’)’, file)
if (match and match.group(2) is not None):
fileIndex = int(match.group(2))
if(fileIndex >= fromIndex and fileIndex <= toIndex):
return file

def findFilesInRange(files, fileStartMatch, fromIndex, toIndex, fileEndMatch):
filesInRange=[]
for file in files:
outputFile=isFileInRange(file, fileStartMatch, fromIndex, toIndex, fileEndMatch)
if(outputFile is not None):
filesInRange.append(outputFile)
return filesInRange

if __name__ == ’__main__’:
main(sys.argv[1:])

[/python]

Exempel på användning
Används på egen risk!
[bash]

peter@E5410:~/bashtest$ ls
bild0.jpg bild17.jpg bild24.jpg bild31.jpg bild38.jpg bild45.jpg bild52.jpg bild59.jpg bild66.jpg bild73.jpg bild80.jpg bild87.jpg bild94.jpg
bild100.jpg bild18.jpg bild25.jpg bild32.jpg bild39.jpg bild46.jpg bild53.jpg bild60.jpg bild67.jpg bild74.jpg bild81.jpg bild88.jpg bild95.jpg
bild12.jpg bild19.jpg bild26.jpg bild33.jpg bild40.jpg bild47.jpg bild54.jpg bild61.jpg bild68.jpg bild75.jpg bild82.jpg bild89.jpg bild96.jpg
bild13.jpg bild20.jpg bild27.jpg bild34.jpg bild41.jpg bild48.jpg bild55.jpg bild62.jpg bild69.jpg bild76.jpg bild83.jpg bild90.jpg bild97.jpg
bild14.jpg bild21.jpg bild28.jpg bild35.jpg bild42.jpg bild49.jpg bild56.jpg bild63.jpg bild70.jpg bild77.jpg bild84.jpg bild91.jpg bild98.jpg
bild15.jpg bild22.jpg bild29.jpg bild36.jpg bild43.jpg bild50.jpg bild57.jpg bild64.jpg bild71.jpg bild78.jpg bild85.jpg bild92.jpg bild99.jpg
bild16.jpg bild23.jpg bild30.jpg bild37.jpg bild44.jpg bild51.jpg bild58.jpg bild65.jpg bild72.jpg bild79.jpg bild86.jpg bild93.jpg makefiles.sh
peter@E5410:~/bashtest$ rms -s’bild’ -f0 -t19 -e’.jpg’
Do you which to delete these files: [’bild0.jpg’, ’bild12.jpg’, ’bild13.jpg’, ’bild14.jpg’, ’bild15.jpg’, ’bild16.jpg’, ’bild17.jpg’, ’bild18.jpg’, ’bild19.jpg’]?

(y)es or (n)o:
[/bash]

Gott nytt år

[bash]

#!/bin/bash

i=2000
max=2011
while [ ”$i” -lt ”$max” ]
do
echo ”happy new year $i”
i=`expr $i + 1`
done

[/bash]

Antecknar lite linux tips

Fick frågan om jag visste något smidigt sett att behålla de 10 första bilderna i en serie och ta bort resten bilderna serien med hjälp av något eller några linux kommando.

För att ha några filer jag kan testa mot så skrev jag ett litet skript 🙂
[bash]#!/bin/bash

i=0
max=10000
while [ "$i" -lt "$max" ]
do
touch "bild$i.jpg"
i=`expr $i + 1`
done
[/bash]

Innan du börjar försöka med dessa kommandon kan du testa med ls först eller använda -i flaggan på rm för att få bekräfta den dina val.

Om man har bildserier som börjar på 0 så kan ta bort de 10 första genom att skriva följande.
[bash]rm bild[0-9].jpg
[/bash]
och om man vill ta bort alla bilder förutom de tio första förutsatt att serien börjar på 0 så kan man skriva så här
[bash]rm bild[0-9]?*.jpg
[/bash]
uttrycket säger ta bort alla filer vars filnamn börjar på ”bild” och innehåller ett tecken efter ”bild” som innehåller en siffra mellan 0-9 frågetecknet säger att det måste finnas ett tecken efter siffran och stjärnan kommer matcha noll eller alla tecken fram till .jpg

Wildcards info hos tldp.org

Något som är värt att nämna är man helst skulle vilja använda bild[0-9]{2,10} som i ett vanligt regexp för verkligen försäkra sig om att det är siffror man jämför mot. men även om skulle göra det så kollar man bara om det är siffror och inte om siffrorna är inom ett visst intervall som tex bild3-bild303.

Om man vill använda find med xargs kan man göra så här
[bash]
find . -name ’bild[0-9]?*.jpg’ -print0 | xargs –null /bin/rm -f
[/bash]

Denna går att förbättra!
[bash]
find . -iregex ’./bild[0-9][0-9]?..[.]jpg’ -print
[/bash]

Jag kommer nog fortsätta på det här inlägget till jag hittat något bra och enkelt sätt att göra det på.

Min första python klass :)

[python]
”’
Created on 20 okt 2010
@author: Peter Lindblom
”’
import subprocess
from time import localtime, strftime
import re

class LoopiaDnsSync:
"""A simple loopia dns python module"""
__user = ""
__domains = []
def __init__(self, username, password, domains=[]):
"""Username, Password, optional list of domains"""
self.__user = username + ":" + password
self.__domains = domains

def addDomain(self, domain):
"""Adds a domain to the list of domains and returns current LoopiaDnsSync instance"""
self.__domains.append(domain);
return self

def __getIpAddress(self):
"""Gets your current ip-address"""
outputStr = subprocess.Popen(["curl", "-s", "http://dns.loopia.se/checkip/checkip.php"], stdout=subprocess.PIPE).communicate()[0]
return re.search(’^.*: ([^<]*).*$’, outputStr).group(1)

def __syncADomain(self, user, currentIP, domain):
"""Syncs a domain at a time"""
inputStr = "http://dns.loopia.se/XDynDNSServer/XDynDNS.php?hostname=" + domain + "&myip=" + currentIP
outputStr = subprocess.Popen(["curl", "-s", "–user", user, inputStr], stdout=subprocess.PIPE).communicate()[0]
return domain+"="+currentIP+": "+outputStr

def syncDomains(self):
"""Syncs all domains using __syncADomain"""
print __name__+": " + strftime("%a, %d %b %Y %H:%M:%S", localtime())
ipAdress = self.__getIpAddress()
for domain in self.__domains:
print self.__syncADomain(self.__user, ipAdress, domain)

[/python]

loopiadns multidomain

[bash]
#!/bin/bash

#########################################################################
## SETTINGS ##
#########################################################################

USER_NAME="user"
USER_PASSWORD="password"

DOMAINS=""
DOMAINS="$DOMAINS minlinuxserver.com"
DOMAINS="$DOMAINS minlinuxserver.se"
DOMAINS="$DOMAINS www.minlinuxserver.com"
DOMAINS="$DOMAINS www.minlinuxserver.se"

#########################################################################
## THE PROGRAM ##
#########################################################################
# Print the date and time
echo `date -R`;

# Credentials in curl format
CREDENTIALS="$USER_NAME:$USER_PASSWORD"

# Get your current ip number
IP_ADDRESS=`curl -s dns.loopia.se/checkip/checkip.php | sed ’s/^.*: \([^<]*\).*$/\1/’`

#Print info
echo "Domain: Status"

#Foreach domain in domains sync
for DOMAIN in $DOMAINS; do

#Do sync
STATUS=$(curl -s –user $CREDENTIALS "http://dns.loopia.se/XDynDNSServer/XDynDNS.php?hostname=$DOMAIN&myip=$IP_ADDRESS"; echo)

#Print sync result
echo "$DOMAIN: $STATUS"
done

[/bash]

Memory för android

Nu har jag gjort ett Memory spel för android telefoner 🙂 Här under finns bilder och en qr kod 🙂 Stort nöje!