För att använda utökade filattribut (eller extended attributes - eller xattr) krävs en kärna som stöder det (2.6 eller senare); ett filsystem som stöder det (ext2, ext3, ReiserFS eller XFS). Dessutom krävs att disken, partitionen eller enheten där det ska användas är monterad med växeln user_xattr i /etc/fstab.
Såhär kan det se ut i /etc/fstab när /home är monterat med stöd för xattr:
| Code: |
UUID=510a1719-0adf-4cb3-8df0-bb9d50b43539 /home ext3 defaults,user_xattr 0 2
|
För att ändringen i fstab ska träda i kraft måste (i det här fallet) /home monteras om. Alternativt så startar man om datorn.
Nedan två python-script som ska göra det lite lättare och smidigare att använda de nya utökade filattributen: 'memo' - för att sätta och radera filanmärkningar och 'lls' som fungerar lite som 'ls' men även listar anmärkningarna. Det senare scriptet hittade jag på nätet. Tyvärr minns jag inte vart - eller vem som skrivit det. Jag har modifierat det en aning.
Så här kan det se ut:
Såhär används de nya kommandona (scripten)
memo
~$ memo 'Textfiler som ska arkiveras' *.txt
~$ memo 'Pythonprogram som inte är klart' test.py
~$ memo -d *.txt (radera kommentarer från alla textfiler)
~$ memo -d test.py (radera kommentar från test.py)
lls
~$ lls (full fillista med ev. kommentarer)
~$ lls *.txt (textfiler med ev. kommentarer)
~$ lls -o (lista bara filer som har kommentarer)
~$ lls -o *.doc (lista bara doc-filer som har kommentarer)
(växeln -a för att inkludera dolda filer är inte implementerad)
lls är någons försök att emulera 'ls'-kommandot i python. Jag hittade det på nätet och modifierade det en smula för att inkludera stöd för xattr.
memo - kod
| Code: |
#!/usr/bin/env python
# _*_ coding: utf-8 _*_
import sys
import xattr
def write_xattr(file, message):
try:xattr.setxattr(file, 'user.comment', message)
except: print "unable to set xattr for file " + file
def remove_xattr(file):
try: xattr.removexattr(file, 'user.comment')
except: print "unable to remove xattr for file " + file
if len(sys.argv) < 2:
print "Usage: 'memotext' filespec | -d filespec"
sys.exit(1)
files = sys.argv[2:]
for f in files:
if sys.argv[1] == '-d': remove_xattr(f)
else: write_xattr(f, sys.argv[1])
|
memo kräver modulen xattr som installeras med kommandot:
sudo aptitude install python-xattr
lls - kod
| Code: |
#!/usr/bin/env python
import sys, stat, os
import grp, pwd
import locale
import time
import xattr
limit = 0
if len(sys.argv) == 1 or (len(sys.argv) == 2 and sys.argv[1] == '-o'):
try:
if sys.argv[1] == '-o': limit = 1
except:
pass
files=os.listdir(".")
files=[filename for filename in files if filename[0] != '.']
else:
if sys.argv[1] == '-o':
files = sys.argv[2:]
limit = 1
else:
files=sys.argv[1:]
locale.setlocale(locale.LC_ALL,'')
files.sort(locale.strcoll)
now = int(time.time())
recent = now - (6*30*24*60*60)
colours={"default":"",
"blue": "\x1b[01;34m",
"cyan": "\x1b[01;36m",
"green": "\x1b[01;32m",
"red": "\x1b[01;05;37;41m",
"purple": "\x1b[01;35m"}
def get_mode_info(mode):
perms="-"
colour="default"
link=""
if stat.S_ISDIR(mode):
perms="d"
colour="blue"
elif stat.S_ISLNK(mode):
perms="l"
colour="cyan"
link = os.readlink(filename)
if not os.path.exists(filename):
colour="red"
elif stat.S_ISREG(mode):
if mode & (stat.S_IXGRP|stat.S_IXUSR|stat.S_IXOTH):
colour="green"
mode=stat.S_IMODE(mode)
for who in "USR", "GRP", "OTH":
for what in "R", "W", "X":
if mode & getattr(stat,"S_I"+what+who):
perms=perms+what.lower()
else:
perms=perms+"-"
return (perms, colour, link)
for filename in files:
try:
stat_info=os.lstat(filename)
except:
sys.stderr.write("%s: No such file or directory\n" % filename)
continue
perms, colour, link = get_mode_info(stat_info.st_mode)
nlink = "%4d" % stat_info.st_nlink
try:
name = "%-8s" % pwd.getpwuid(stat_info.st_uid)[0]
except KeyError:
name = "%-8s" % stat_info.st_uid
try:
group = "%-8s" % grp.getgrgid(stat_info.st_gid)[0]
except KeyError:
group = "%-8s" % stat_info.st_gid
size = "%8d" % stat_info.st_size
try: data = " <" + xattr.getxattr(filename, 'user.comment') + ">"
except: data = ''
ts = stat_info.st_mtime
if (ts < recent) or (ts > now):
time_fmt = "%b %e %Y"
else:
time_fmt = "%b %e %R"
time_str = time.strftime(time_fmt, time.gmtime(ts))
if not limit or (limit and data != ''):
sys.stdout.write("%s %s %s %s %s %s " % (perms, nlink, name, group, size, time_str))
if colours[colour]:
sys.stdout.write(colours[colour] + filename + colours["purple"] + data + "\x1b[00m")
else:
sys.stdout.write(filename + colours["purple"] + data + "\x1b[00m")
if link:
sys.stdout.write(" -> ")
print link
|
Inlägg ändrat av marwal, den 2007-09-19 19:54