1.8. Gestió bàsica de fitxers
1.8.2. Metacaràcters i operadors
Si esteu llistant, movent, copiant, eliminant o realitzant qualsevol altra acció amb arxius en el vostre sistema Gnu/Linux, existeixen certs caràcters especials, denominats metacaràcters i operadors, que us ajudaran a treballar amb arxius de manera més eficient. Els metacaràcters poden ajudar a fer coincidir un o diversos arxius sense haver d’escriure completament cada nom d’arxiu. Els operadors us permeten adreçar informació d’una ordre o arxiu a una altra ordre o arxiu.
D’altra banda, també cal introduir certs mecanismes de citació. Amb exemples, serà més fàcil d’entendre:
Caràcter escapament
Una barra invertida no citada «\
» és el caràcter d’escapament de bash: preserva el valor literal del següent caràcter que segueix, amb l’excepció de la nova línia.
$ echo variable; argument
variable argument: command not found
# Si s’escriu «\;
» t’ajuda a utilitzar «;
» com un caràcter normal
$ echo variable \; argument
variable ; argument
# Un exemple més subtil. L’objectiu és crear un sol fitxer que s’anomeni el meu fitxer.txt
$ touch el meu fitxer.txt
$ ls meu*txt
ls: cannot access meu*txt': No such file or directory
$ rm fitxer.txt meu
# Amb el caràcter escape es genera un únic fitxer
$ touch meu\ fitxer.txt
$ ls meu*txt
'meu fitxer.txt'
$ rm meu\ fitxer.txt
Cometes simples
Tancar caràcters amb cometes simples (')
preserva el valor literal de cada caràcter dins de les cometes. No hi pot haver una cometa simple entre cometes simples, fins i tot quan està precedida per una barra invertida. I cap caràcter és especial dins de les cadenes entre cometes simples. Exemples:
$ echo 'variable; argument'
variable; argument
# Es poden col·locar cadenes representades per diferents mecanismes de citació una al costat de l’altra per concatenar-les. Un altre exemple:
# concatenació of 4 strings # 1: '@ordre = ' # 2: \' # 3: 'sort and grep' # 4: \'
$ echo '@ordre = '\' sort and grep'\'
@ordre = 'sort and grep\
Cometes dobles
Tancar caràcters en cometes dobles (")
preserva el valor literal de tots els caràcters dins de les cometes, amb l’excepció de $
,’, ,
i quan l’expansió d’història està habilitada, !
. Aquí hi ha un exemple que mostra la interpolació de variables dins de cometes dobles:
$ qty='5'
# Cap caràcter és especial dins de les cometes simples
$ echo 'Des de principi d’any, he executat $qty GWAS'
Des de principi d’any, he executat $qty GWAS
# Un ús típic de les cometes dobles és habilitar la interpolació de variables
$ echo "Des de principi d’any, he executat $qty GWAS"
Des de principi d’any, he executat 5 GWAS
# Llevat que vulguis específicament que la shell interpreti el contingut d’una variable, sempre has d’escriure entre cometes la variable per evitar problemes a causa de la presència de metacaràcters de la shell
$ f='segon fitxer.txt'
# Seria el mateix que: echo ‘pac informe’ > segon fitxer.txt
$ echo 'pac informe' > $f
bash: $f: ambiguous redirect
# Seria el mateix que: echo ‘pac informe’ > ‘segon fitxer.txt’
$ echo 'pac informe' > "$f"
$ cat "$f"
pac informe
$ rm "$f"
Ara sí que ens introduïm més profundament en la definició de metacaràcters i operadors.
Metacaràcters
Per estalviar-vos haver de prémer algunes tecles i per poder-vos referir fàcilment a un grup d’arxius, la shell bash us permet l’ús de metacaràcters. Aquí hi ha alguns metacaràcters útils per fer coincidir noms d’arxius. A la taula 4 es descriuen els més habituals.
Taula 4. Metacaràcters de fitxer.
Comodí | Descripció |
? | Coincidir un caràcter, qualsevol caràcter |
* | Coincidir qualsevol quantitat de caràcters |
[….] | Coincidir qualsevol dels caràcters entre claudàtors, que poden incloure un rang de lletres o números separats per un guió |
[! ….] | No coincidir amb cap dels caràcters entre els claudàtors, que poden incloure un rang de lletres o números separats per un guió |
Proveu alguns d’aquests metacaràcters de coincidència d’arxius anant primer a un directori buit (com el directori de prova descrit a la secció anterior) i creant alguns arxius buits. L’ordre touch
crea arxius buits. Les línies d’ordres que segueixen mostren com usar metacaràcters de shell amb l’ordre ls
per coincidir amb noms d’arxiu. Qualsevol altra ordre també funciona.
$ touch Transcriptomics Proteomics Epigenomics Metagenomics Pharmacogenomics
$ ls P*
Pharmacogenomics Proteomics
# S’imprimeix qualsevol arxiu que comenci amb P
$ ls P*t*
Proteomics
# S’imprimeix qualsevol arxiu que comenci amb P i contingui la t
$ ls [EM]*
Epigenomics Metagenomics
# S’imprimeix qualsevol arxiu que comenci per E or M
$ ls [P-Z]*
Pharmacogenomics Proteomics Transcriptomics
#S’imprimeixen tots els noms d’arxiu que comencen amb una lletra entre P i Z
$ ls ???genomics
Epigenomics
# S’imprimeix qualsevol arxiu d’11 caràcters que acabi amb la cadena genomics
Metacaràcters de redireccionament d’arxius
Les ordres reben dades des de l’entrada estàndard i les envien a la sortida estàndard. Fent servir pipes (en català, tubs) es pot dirigir la sortida estàndard d’una ordre a l’entrada estàndard d’una altra. Amb arxius, es pot fer servir el signe menor que (<
) i més gran que (>
) per dirigir dades cap a i des d’arxius. A la taula 5 es recullen els caràcters de redirecció d’arxius:
Taula 5. Metacaràcters de redirecció.
Comodí | Descripció |
< |
Dirigeix el contingut d’un arxiu a l’ordre. En la majoria dels casos, aquesta és l’acció predeterminada esperada per l’ordre i l’ús del caràcter és opcional; usar «less seq.fa » és el mateix que «less < seq.fa » |
> |
Dirigeix la sortida estàndard d’una ordre a un arxiu. Si l’arxiu existeix, el contingut d’aquest arxiu se sobreescriu |
2> |
Dirigeix l’error estàndard (missatges d’error) a l’arxiu |
&> |
Dirigeix tant la sortida estàndard com l’error estàndard a l’arxiu |
>> |
Dirigeix la sortida d’una ordre a un arxiu, agregant la sortida al final de l’arxiu existent |
Les següents línies són exemples realitzats mitjançant línies d’ordre on la informació s’adreça cap a i des d’arxius:
$ mail root < ~/.bashrc
$ man chown | col -b > /tmp/chown
$ echo "Estic practicant els exercicis d’HIB a $(date)" >> ~/testHIB/testimoni
En el primer exemple, el contingut de l’arxiu . bashrc en el directori d’inici s’envia en un missatge de correu a l’usuari root de la màquina Gnu/Linux. La segona línia d’ordre de la pàgina del manual de chown (usant l’ordre man
) elimina els espais en blanc addicionals (col -b
) i envia la sortida a l’arxiu /tmp/chown (esborrant l’arxiu /tmp/chown anterior, si existís). L’ordre final genera un fitxer de text que es visualitza amb l’ordre cat
:
$cat testHIB/testimoni
Estic practicant els exercicis d’HIB a Wed 19 Apr 19:08:04 CEST 2023
Un altre tipus de redirecció us permet escriure text que es pot fer servir com a entrada estàndard per a una ordre. Aquí, els documents impliquen ingressar dos caràcters de menor (<<
) després d’una ordre seguida d’una paraula. Tot el que escrigui després d’aquesta paraula s’interpretarà com a entrada de l’usuari fins que es repeteixi la paraula en una línia a part.
$ mail student Josep Joan Guerau Bego << missatge
> Us recordo que cal realitzar tots els exercicis > proposats per entendre l’assignatura. > > equip HIB > missatge
$
Aquest exemple envia un missatge de correu als usuaris student, Josep, Joan, Guerau i Bego. El text introduït entre <<missatge>> i <<missatge>> esdevé el contingut del missatge.
Caràcters d’expansió de claus
Quan useu claus ({}
), podeu expandir un conjunt de caràcters en els noms d’arxiu, noms de directoris o altres arguments que doneu a les ordres. Per exemple, si voleu crear el conjunt d’arxius des de sequence1 fins a sequence7, podeu fer-ho de la següent manera:
$ touch sequence{1,2,3,4,5,6,7}
$ ls
sequence1 sequence2 sequence3 sequence4 sequence5 sequence6 sequence7
$ rm sequence?
Els elements que s’expandeixen no han de ser números, ni tan sols dígits únics; podríeu fer servir rangs de números o dígits. També podríeu fer servir qualsevol cadena de caràcters, sempre que se separin amb comes. Exemple:
$ touch sequence{1..4}-{human,drosophila}
$ ls
sequence1-drosophila sequence2-drosophila sequence3-drosophila sequence4-drosophila sequence1-human sequence2-human sequence3-human sequence4-human
$ rm sequence*
Permisos d’arxius i la propietat
Després de treballar amb Gnu/Linux durant un temps, és gairebé segur que obtindreu un missatge de permís denegat. Els permisos associats a arxius i directoris a Gnu/Linux van ser dissenyats per evitar que els usuaris accedeixin als arxius privats d’altres usuaris i per protegir els arxius importants del sistema. Els nou bits assignats a cada arxiu per als permisos defineixen l’accés que vosaltres i d’altres usuaris tenen en el vostre arxiu. Els bits de permís per a un arxiu regular apareixen com -rwxrwxrwx. Aquests bits es fan servir per definir qui pot llegir, escriure o executar l’arxiu.
Dels permisos de nou bits, els primers tres bits s’apliquen al permís del propietari, els següents tres s’apliquen al grup assignat a l’arxiu i els darrers tres s’apliquen a tots els altres. La r significa lectura, la w significa escriptura i la x significa permisos d’execució. Si apareix un guió en lloc de la lletra, significa que aquest permís està desactivat per a aquest bit associat de lectura, escriptura o execució.
Podeu veure els permisos de qualsevol arxiu o directori escrivint l’ordre ls -ld. L’arxiu o directori anomenat apareix com es mostra en aquest exemple:
$ ls -ld testHIB testHIB/testimoni
-rw-rw-r-- 1 student student 73 Apr 19 19:08 testHIB/testimoni drwxr-xr-x 2 student student 4096 Apr 19 19:27 testHIB
La primera línia mostra que l’arxiu testimoni té permís de lectura i escriptura per al propietari i el grup. Tots els altres usuaris tenen permís de lectura, cosa que significa que poden veure l’arxiu, però que no poden canviar el seu contingut ni eliminar-lo. La segona línia mostra el directori testHIB (indicat per la lletra d abans dels bits de permís). El propietari té permisos de lectura, escriptura i execució, mentre que el grup i altres usuaris només tenen permisos de lectura i execució. Com a resultat, el propietari pot agregar, canviar o eliminar arxius en aquest directori, i tots els altres només poden llegir-ne el contingut, canviar aquest directori i llistar el contingut del directori.
Si sou propietari d’un arxiu, podeu fer servir l’ordre chmod
per canviar els permisos com desitges. En un mètode per fer-ho, a cada permís (lectura, escriptura i execució) se li assigna un número: r = 4, w = 2 i x = 1, i s’utilitza el nombre total de cada conjunt per establir el permís. Per exemple, per fer que els permisos estiguin completament oberts per a vosaltres com a propietaris, establiríeu el primer número en 7 (4 + 2 + 1), i després donaríeu al grup i a altres persones permisos només de lectura establint tant el segon com el tercer número en 4 (4 + 0 + 0), de manera que el número final sigui 744. Qualsevol combinació de permisos pot resultar des de 0 (sense permís) fins a 7 (permís complet).
Aquí hi ha alguns exemples de com canviar el permís d’un arxiu (anomenat arxiu) i de quin permís en resultaria:
# L’execució de l’ordre chmod dona com a resultat aquest permís: rwxrwxrwx
$ chmod 777 arxiu
# L’execució de l’ordre chmod dona com a resultat aquest permís: rwxr-xr-x
$chmod 755 arxiu
# L’execució de l’ordre chmod dona com a resultat aquest permís: rw-r--r--
$ chmod 644 arxiu rw-r--r-
# L’execució de l’ordre chmod dona com a resultat aquest permís: ---------
$ chmod 000 arxiu
L’ordre chmod
també es pot fer servir de manera recursiva. Per exemple, suposem que es desitja donar una estructura de directoris completa amb permís 755 (rwxr-xr-x
), començant al directori $HOME/testHIB
. Per fer això, es podria fer servir l’opció -R
(recursiva):
$ chmod -R 755 $HOME/testHIB
Tots els arxius i directoris de sota, incloent-hi el directori Work en el seu directori d’inici, tindran els permisos 755 establerts. Atès que, amb tots els bits de permís alhora, l’enfocament dels números per establir canvis de permís generen confusió, és més comú usar lletres per canviar els bits de permís en un gran conjunt d’arxius.
També podeu activar i desactivar els permisos d’un arxiu utilitzant els signes més (+
) i menys (-
), respectivament, juntament amb lletres per indicar quins canvis i per a qui. Fent servir lletres per a cada arxiu podeu canviar els permisos per a l’usuari (u), el grup (g
), altres (o
) i tots els usuaris (a
). El que canviaríeu inclou els bits de lectura (r
), escriptura (w
) i execució (x
). Per exemple, comenceu amb un arxiu que tingui tots els permisos oberts (rwxrwxrwx
). Executeu les següents ordres chmod
utilitzant opcions amb signe menys. Els permisos resultants es mostren a la dreta de cada ordre:
# L’execució de l’ordre chmod resulta en aquest permís: r-xr-xr-x
$ chmod a-w arxiu
# L’execució de l’ordre chmod resulta en aquest permís: rwxrwxrw-
$ chmod o-x arxiu
# L’execució de l’ordre chmod resulta en aquest permís: rwx------
$ chmod go-rwx arxiu
Així mateix, els següents exemples comencen amb tots els permisos tancats (---------
). El signe més s’utilitza amb chmod
per activar els permisos:
# L’execució de l’ordre chmod resulta en aquest permís: rw-------
$ chmod u+rw arxiu
# L’execució de l’ordre chmod resulta en aquest permís: --x--x--x--x
$ chmod a+x arxiu
# L’execució de l’ordre chmod resulta en aquest permís: r-xr-x---
$ chmod ug+rx arxiu
L’ús de lletres per canviar els permisos de manera recursiva amb chmod
funciona generalment millor que l’ús de números, perquè es poden canviar els bits selectivament, en lloc de canviar tots els bits de permís alhora.