Un servidor en producció acumula desenes de milers de fitxers. A srv-tramontana hi ha quatre releases, còpies de seguretat en tres carpetes, fitxers .bak- repartits per on algú va editar alguna cosa, i registres que creixen cada dia. Quan la Marta pregunta «quant ocupen els releases vells?» o quan cal esbrinar si una credencial s'ha colat en algun fitxer, no serveix navegar amb cd i ls: cal preguntar-ho al sistema.

Aquesta lliçó et dona les tres eines de cerca i, més important, el criteri per triar entre elles. locate respon en mil·lisegons però et pot mentir. find recorre l'arbre de debò i accepta criteris que cap altra eina no ofereix. grep no busca fitxers: busca dins d'ells. Són tres problemes diferents, i confondre'ls es paga en temps o en errors.

Contingut

  1. Tres eines, tres problemes
  2. locate: la base de dades precalculada
  3. find: anatomia d'una cerca
  4. Criteris de find: nom, tipus, mida, temps, propietat, profunditat
  5. Combinar criteris amb lògica
  6. Accions: -print, -delete, -exec i -execdir
  7. Noms amb espais i el patró -print0 | xargs -0
  8. grep a fons
  9. ripgrep, l'alternativa moderna
  10. Casos reals de Tramontana

  1. Tres eines, tres problemes

Pregunta Eina Per què
On és el fitxer que es diu X? locate Instantani; suficient si el fitxer no és recent
Quins fitxers compleixen aquestes condicions? find L'únic que filtra per mida, data, permisos, propietari
Quins fitxers contenen aquest text? grep -r És l'únic que obre i llegeix el contingut

La confusió típica és fer servir find per al que fa grep o a l'inrevés. Regla mnemotècnica: find busca per les propietats del fitxer, grep busca pel seu contingut. I es combinen constantment, perquè l'habitual és «busca als fitxers que compleixen X si apareix Y».

  1. locate: la base de dades precalculada

locate no recorre el disc: consulta un índex generat periòdicament. A Ubuntu 24.04 la implementació és plocate.

operador@srv-tramontana:~$ sudo apt install -y plocate
operador@srv-tramontana:~$ locate confirmacio.html
/opt/tramontana/releases/3.2.1/plantilles/confirmacio.html
/opt/tramontana/releases/3.3.0/plantilles/confirmacio.html
operador@srv-tramontana:~$ touch /home/operador/dades/prova-locate.txt
operador@srv-tramontana:~$ locate prova-locate.txt      # sense sortida: encara no indexat
operador@srv-tramontana:~$ sudo updatedb && locate prova-locate.txt
/home/operador/dades/prova-locate.txt

La base s'actualitza un cop al dia mitjançant una tasca programada. Fins que no s'executi updatedb, el que acabes de crear no existeix per a locate, i el que acabes d'esborrar continua apareixent.

Opcions útils: -i (ignora majúscules), -c (compta), -b '\nom' (coincideix només amb el nom base), -l 5 (limita resultats), -e (verifica que el fitxer encara existeix). Quan fer-lo servir: per localitzar un fitxer de sistema o de configuració del qual recordes el nom a mitges. Quan no: en qualsevol procediment seriós, i mai com a entrada d'una ordre destructiva. Un rm alimentat per locate pot intentar esborrar rutes obsoletes o passar per alt el que sí que s'havia d'esborrar.

  1. find: anatomia d'una cerca

find <rutes> <criteris> <accions>

Els tres blocs van en aquest ordre, i aquesta és la font de la meitat dels errors. find processa els arguments seqüencialment: tot el que va abans del primer criteri ho interpreta com a ruta.

operador@srv-tramontana:~$ find /opt/tramontana/releases -maxdepth 1 -type d
/opt/tramontana/releases
/opt/tramontana/releases/3.1.0
/opt/tramontana/releases/3.2.0
/opt/tramontana/releases/3.2.1
/opt/tramontana/releases/3.3.0

Si no indiques acció, find assumeix -print. Si no indiques ruta, fa servir el directori actual; escriure-la sempre és un bon costum, perquè un find sense ruta llançat des de / recorre el sistema sencer.

  1. Criteris de find

Per nom

Criteri Coincideix amb
-name '*.log' el nom base, distingeix majúscules
-iname '*.LOG' igual però sense distingir
-path '*/plantilles/*' la ruta completa
-regex '.*/3\.[12]\..*' la ruta completa, amb expressió regular

El patró va entre cometes simples, sense excepció: si no, Bash l'expandeix contra el directori actual abans que find el vegi, i busques una altra cosa.

Per tipus

-type f fitxer regular, d directori, l enllaç simbòlic, s sòcol, b/c dispositius, p canonada amb nom.

find /opt/tramontana -maxdepth 1 -type l -ls et retorna una sola entrada: l'enllaç de desplegament app -> releases/3.2.1 del Mòdul 2, amb el seu destí relatiu.

Per mida

-size accepta sufixos: c bytes, k KiB, M MiB, G GiB. Sense sufix, la unitat són blocs de 512 bytes, que gairebé mai és el que vols. El signe delimita: +10M més gran que, -10M més petit que, 10M exactament (arrodonit cap amunt, així que poques vegades és útil).

operador@srv-tramontana:~$ find /opt/tramontana -type f -size +10M -exec ls -lh {} +
-rwxr-x--- 1 root tramontana 48M Aug 10 09:12 /opt/tramontana/releases/3.2.1/executable
-rwxr-x--- 1 root tramontana 48M Aug 15 11:03 /opt/tramontana/releases/3.3.0/executable

Per temps

Aquí hi ha el detall que cal entendre bé perquè genera resultats equivocats en silenci.

Criteri Unitat Significat
-mtime n dies contingut modificat
-mmin n minuts contingut modificat
-atime / -amin dies / minuts últim accés
-ctime / -cmin dies / minuts metadades canviades
-newer FITXER — més recent que aquell fitxer

Per què -mtime +7 no significa «modificat els últims 7 dies» ni «fa més de 7 dies» tal com ho diries en veu alta. find calcula els dies transcorreguts i descarta la part decimal. Un fitxer de 7 dies i 20 hores té una antiguitat de 7,83 dies, que truncat és 7. I +7 significa «estrictament més gran que 7», així que aquest fitxer no hi coincideix. A la pràctica, -mtime +7 selecciona el que té més de 8 dies d'antiguitat.

Expressió Selecciona fitxers amb antiguitat
-mtime 0 menys de 24 h
-mtime -7 menys de 7 dies
-mtime 7 entre 7 i 8 dies exactament
-mtime +7 8 dies o més

Quan la precisió importa —i en una purga automàtica importa— fes servir -mmin o, millor, compara contra un fitxer de referència:

operador@srv-tramontana:~$ touch -d '2026-08-01 00:00' /tmp/ref
operador@srv-tramontana:~$ find /srv/tramontana/backups -type f ! -newer /tmp/ref

Això és «anterior a l'1 d'agost», sense ambigüitat i sense aritmètica mental. És la manera que fem servir a Tramontana.

Per propietat i permisos

operador@srv-tramontana:~$ find /var/log/tramontana -type f ! -group adm
operador@srv-tramontana:~$ find /opt/tramontana -type f -perm /u+s

El primer verifica que tots els registres tenen adm com a grup propietari; sense sortida significa que la convenció es compleix. El segon és una auditoria de seguretat: busca binaris amb SUID, aquell bit que a 02-07 vas aprendre a reconèixer. La sintaxi de -perm té tres formes:

Forma Significa
-perm 640 permisos exactament 640
-perm -640 com a mínim aquests bits (en pot tenir més)
-perm /640 algun d'aquests bits

També -user operador, -group tramontana, -uid 997, -nouser i -nogroup (orfes, típics després d'esborrar un compte).

Per profunditat

operador@srv-tramontana:~$ find /opt/tramontana -maxdepth 2 -type d

-maxdepth i -mindepth són opcions de posició: han d'anar abans de qualsevol criteri. Si escrius find /opt -name '*.log' -maxdepth 2, find funciona però avisa que el resultat no és el que esperes, perquè aleshores ja ha decidit descendir. Posa-les sempre just després de la ruta.

  1. Combinar criteris amb lògica

Els criteris consecutius es combinen amb I implícit. Per a la resta:

Operador Significat
-a I (implícit, gairebé mai s'escriu)
-o O
! o -not negació
\\( \\) agrupació (els parèntesis van escapats)
operador@srv-tramontana:~$ find /home/operador -type f \( -name '*.bak-*' -o -name '*.tmp' \) -mtime +30
/home/operador/.bashrc.bak-2026-07-02
/home/operador/dades/reserves.csv.bak-2026-07-11

Els parèntesis són imprescindibles: sense ells, la precedència fa que -mtime +30 s'apliqui només a l'última alternativa, i t'emportaries per davant tots els .bak-* sense importar-ne l'edat. Quan barregis -o amb qualsevol altra cosa, agrupa. Els parèntesis s'escapen perquè per a Bash són metacaràcters; també valen '(' i ')'.

  1. Accions

Acció Què fa
-print imprimeix la ruta (per defecte)
-print0 igual, separant amb byte nul
-ls com ls -dils
-delete esborra (s'avalua abans que altres criteris: compte)
-exec CMD {} \; executa CMD un cop per fitxer
-exec CMD {} + executa CMD agrupant fitxers
-execdir CMD {} \; igual, però des del directori del fitxer
-ok CMD {} \; com -exec, demanant confirmació

{} és el marcador que find substitueix per la ruta. El terminador \; va escapat perquè Bash no se'l quedi.

\; enfront de +: la diferència de rendiment

Amb \; es llança un procés per fitxer. Amb +, find acumula rutes i llança el mínim nombre de processos possible. Sobre 5.000 fitxers del sistema:

operador@srv-tramontana:~$ time find /usr/share/doc -type f -exec basename {} \; > /dev/null
real    0m11,482s
operador@srv-tramontana:~$ time find /usr/share/doc -type f -exec basename {} + > /dev/null
real    0m0,213s

Cinquanta vegades més ràpid. La diferència no és l'ordre: és el cost de crear milers de processos. Fes servir + sempre que l'ordre accepti diversos arguments. Necessites \; només quan l'ordre admet un únic argument o quan {} apareix al mig de l'ordre (per exemple -exec mv {} {}.old \;).

-execdir i per què és més segur

-execdir executa l'ordre des del directori que conté el fitxer, i li passa ./nom en comptes de la ruta completa. Això elimina una classe sencera de problemes: rutes que comencen per guionet i que l'ordre interpretaria com a opcions, i la condició de cursa en què algú substitueix un directori intermedi per un enllaç simbòlic entre el moment en què find el troba i el moment en què l'ordre actua. Si has d'executar alguna cosa destructiva sobre directoris on escriuen altres usuaris, -execdir és l'opció correcta.

-delete, amb cap

operador@srv-tramontana:~$ find /srv/tramontana/backups/temporals -type f -name '*.tmp' -mtime +7
/srv/tramontana/backups/temporals/export-1.tmp
/srv/tramontana/backups/temporals/export-2.tmp
operador@srv-tramontana:~$ find /srv/tramontana/backups/temporals -type f -name '*.tmp' -mtime +7 -delete

Sempre en dos passos: primer sense -delete per veure la llista, després amb ell. És la mateixa convenció que ja apliques a l'rm. I un advertiment real: -delete implica -depth, i si el col·loques abans dels criteris, find l'avalua abans i esborra tot el que trobi. L'ordre importa.

  1. Noms amb espais i el patró -print0 | xargs -0

Els noms de fitxer a Linux poden contenir espais, tabuladors i fins i tot salts de línia. Qualsevol canonada que separi rutes per espais s'hi trenca.

operador@srv-tramontana:~$ touch '/tmp/informe agost.txt'
operador@srv-tramontana:~$ find /tmp -name '*.txt' | xargs ls -l
ls: cannot access '/tmp/informe': No such file or directory
ls: cannot access 'agost.txt': No such file or directory

La solució és un separador que no pot aparèixer en un nom: el byte nul. find l'emet amb -print0 i xargs l'espera amb -0.

operador@srv-tramontana:~$ find /tmp -name '*.txt' -print0 | xargs -0 ls -l
-rw-r----- 1 operador operador 0 Aug 18 11:20 '/tmp/informe agost.txt'

find ... -print0 | xargs -0 ordre és el patró canònic. Memoritza'l tal qual.

xargs en si

xargs construeix línies d'ordres a partir de la seva entrada estàndard. Opcions que importen:

Opció Efecte
-0 entrada separada per bytes nuls
-n 5 com a màxim 5 arguments per invocació
-I{} substitueix {} per cada línia; implica un argument per invocació
-P 4 executa fins a 4 processos en paral·lel
-r, --no-run-if-empty no executar res si l'entrada és buida
-t mostra l'ordre abans d'executar-la (depuració)

--no-run-if-empty evita un error clàssic: sense ella, xargs rm amb entrada buida executa rm sense arguments. A GNU és el comportament per defecte, però escriure-la explícita fa l'ordre portable i documenta la intenció.

  1. grep a fons

Opció Efecte
-i ignora majúscules
-v inverteix: línies que no coincideixen
-n número de línia
-c només compta coincidències
-l / -L només noms de fitxers amb / sense coincidència
-r / -R recursiu (-R segueix enllaços simbòlics)
-w / -x paraula completa / línia completa
-o imprimeix només la part que coincideix
-A n / -B n / -C n n línies després / abans / de context
-e P1 -e P2 diversos patrons
-f fitxer patrons llegits d'un fitxer
-E / -F / -P ERE / cadenes fixes / PCRE
--include / --exclude filtra quins fitxers es llegeixen en mode recursiu
-q silenciós; només importa $?
operador@srv-tramontana:~$ grep -n -A2 'ERROR 500' /var/log/tramontana/errors.log | head -6
41:2026-08-18 03:12:44 ERROR 500 /reserves db_timeout
42-2026-08-18 03:12:44 TRACE connexions_actives=200
43-2026-08-18 03:12:45 WARN pool exhaurit
--
58:2026-08-18 03:19:02 ERROR 500 /reserves db_timeout

El context converteix una línia solta en una història: l'error 500 va acompanyat de connexions_actives=200, que és exactament el max_connexions d'app.conf. Aquí hi ha una hipòtesi de diagnòstic.

-F enfront de -E. Amb -F, grep tracta el patró com a text literal i fa servir un algorisme de cerca multipatró molt més ràpid que un motor d'expressions regulars. Si busques una cadena fixa, -F és l'opció correcta: més ràpida i sense sorpreses amb els metacaràcters. Buscar 10.0.2.15 amb -E coincidiria també amb 10x0y2z15; amb -F, només amb la IP.

operador@srv-tramontana:~$ grep -rFl '10.0.2.15' /etc/tramontana/
/etc/tramontana/app.conf

-q com a test. No imprimeix res; només retorna 0 si ha trobat alguna cosa. És la manera correcta de preguntar «apareix això?» i encadenar amb &&:

operador@srv-tramontana:~$ grep -q 'log_nivell=debug' /etc/tramontana/app.conf \
    && echo "AVÍS: l'app està en mode depuració"
AVÍS: l'app està en mode depuració

Una troballa real: deixar log_nivell=debug en producció infla els registres i pot abocar dades sensibles al fitxer.

  1. ripgrep, l'alternativa moderna

rg fa el mateix que grep -r i és diverses vegades més ràpid: recorre en paral·lel, respecta .gitignore, ignora binaris i numera les línies per defecte.

operador@srv-tramontana:~$ rg -n 'db_timeout' /var/log/tramontana/
errors.log:41:2026-08-18 03:12:44 ERROR 500 /reserves db_timeout
errors.log:58:2026-08-18 03:19:02 ERROR 500 /reserves db_timeout

S'instal·la amb sudo apt install -y ripgrep. És excel·lent per a la teva feina diària. Amb una salvetat professional: grep és a totes les màquines i rg no. En un servidor aliè, en un contenidor mínim o en un procediment documentat, escriu grep.

  1. Casos reals de Tramontana

a) Releases antics per purgar. Quant ocupen i quins no són l'actiu:

operador@srv-tramontana:~$ readlink /opt/tramontana/app
releases/3.2.1
operador@srv-tramontana:~$ find /opt/tramontana/releases -maxdepth 1 -mindepth 1 -type d \
    ! -name '3.2.1' -exec du -sh {} +
97M     /opt/tramontana/releases/3.1.0
98M     /opt/tramontana/releases/3.2.0
99M     /opt/tramontana/releases/3.3.0

-mindepth 1 exclou el mateix /opt/tramontana/releases, que si no apareixeria a la llista. Abans d'esborrar res: 3.3.0 és el release següent, no un d'antic. La regla que vam fixar és conservar l'actiu i l'immediatament anterior, així que el candidat a purga és 3.1.0, i només ell. Aquest és el criteri que automatitzarem a 03-07.

b) Tots els .bak-* dispersos.

operador@srv-tramontana:~$ sudo find /etc /home /srv /opt -name '*.bak-*' -type f -printf '%TY-%Tm-%Td %10s %p\n' | sort
2026-07-02 3771 /home/operador/.bashrc.bak-2026-07-02
2026-07-11 1284 /home/operador/dades/reserves.csv.bak-2026-07-11
2026-08-18 512 /etc/tramontana/app.conf.bak-2026-08-18

-printf permet compondre la sortida exacta que vols: %TY-%Tm-%Td la data de modificació, %10s la mida alineada, %p la ruta. És més net que encadenar ls i awk.

c) Buscar una credencial pel sistema. La Marta pregunta si la contrasenya de la base de dades pot ser en algun lloc on no hauria de ser:

operador@srv-tramontana:~$ sudo grep -rIl --exclude-dir='.git' -e 'db_password' /etc /home /srv /opt
/etc/tramontana/app.conf
/srv/tramontana/backups/temporals/app.conf.copia

Apareix on toca... i on no. -I omet els binaris (sense ella, l'executable de 48 MB s'analitza inútilment i pot embrutar el terminal), -l dona només el nom del fitxer, i --exclude-dir evita soroll. La segona ruta és una descoberta seriosa:

operador@srv-tramontana:~$ ls -l /srv/tramontana/backups/temporals/app.conf.copia
-rw-r--r-- 1 operador operador 512 Aug 12 17:40 /srv/tramontana/backups/temporals/app.conf.copia

Permisos 644: llegible per qualsevol usuari del sistema, quan l'original és 640 de root:tramontana. És una còpia que en Luis va deixar en depurar un problema de connexió. S'elimina, i a l'informe per a la Marta es diu què protegeix la mesura (ningú més no pot llegir aquella credencial des del servidor) i què no (la contrasenya va estar exposada sis dies; cal rotar-la, perquè esborrar la còpia no desfà l'exposició). Aquesta distinció és la que s'espera de tu.

d) Comptar errors per tipus.

operador@srv-tramontana:~$ grep -c '' /var/log/tramontana/errors.log
87
operador@srv-tramontana:~$ grep -oE 'ERROR [0-9]{3}' /var/log/tramontana/errors.log | sort | uniq -c | sort -rn
     41 ERROR 500
     28 ERROR 503
     18 ERROR 404

grep -c '' compta totes les línies —el patró buit coincideix sempre—: 87, com esperàvem. D'aquestes, 41 són errors 500 de servidor. Això ja és un informe.

Errors Comuns i Consells

  • No posar entre cometes el patró de -name. Bash l'expandeix contra el directori actual i find rep una altra cosa.
  • Posar -maxdepth després dels criteris. Ha d'anar immediatament després de la ruta.
  • Barrejar -o sense parèntesis. La precedència farà que l'últim criteri s'apliqui només a una branca.
  • Interpretar -mtime +7 literalment. Són 8 dies o més. Si importa, fes servir ! -newer fitxer-de-referencia.
  • Encadenar find | xargs sense -print0/-0. Es trenca amb el primer nom que porti un espai.
  • Fer servir -exec ... \; sobre milers de fitxers. Canvia a + i guanyes un ordre de magnitud.
  • Posar -delete abans dels criteris. S'avalua primer i esborra de més. I no et fiïs de locate per prendre decisions: és una foto d'ahir, verifica amb find o amb ls.
  • Consell: find barreja a la sortida els avisos de directoris sense permís. Afegeix-hi 2>/dev/null per silenciar-los —ho veuràs en detall a 03-04— però només quan sàpigues que no t'interessen. I davant d'un find complex, executa'l primer amb -ls: és el seu --dry-run.

Exercicis

Exercici 1. Localitza a /home/operador tots els fitxers regulars més grans d'1 MiB modificats fa més de dues setmanes, mostrant data, mida i ruta ordenats per data. Explica per què no has fet servir -mtime +14 a seques.

Exercici 2. Esbrina quins fitxers de configuració del sistema esmenten el port de la base de dades de Tramontana (5432), excloent-ne els binaris i sense que els noms amb espais trenquin res. Després compta quantes vegades apareix en total.

Exercici 3. Prepara —sense executar-la— la purga del release 3.1.0 i de tots els fitxers .tmp de més de 7 dies a /srv/tramontana/backups/temporals. Mostra exactament què s'esborraria, quant espai s'alliberaria, i justifica la verificació prèvia que faries per no esborrar el release actiu.

Solucions

Solució 1.

operador@srv-tramontana:~$ touch -d '2026-08-04 00:00' /tmp/ref-14d
operador@srv-tramontana:~$ find /home/operador -type f -size +1M ! -newer /tmp/ref-14d \
    -printf '%TY-%Tm-%Td %8s %p\n' | sort
2026-07-11 2097152 /home/operador/dades/export-juny.tar.gz
2026-07-29 5242880 /home/operador/treball/2026/07/dades/abocament.sql

S'evita -mtime +14 perquè la seva semàntica real és «15 dies o més», pel truncament de la part decimal que vam veure a l'apartat 4. Amb un fitxer de referència creat amb touch -d, la frontera és una data concreta i verificable, no el resultat d'una aritmètica que cal recordar. En una purga automàtica aquesta diferència d'un dia pot significar esborrar l'única còpia que quedava. -printf i sort substitueixen ls -l, que no admet ordenar per data una llista arbitrària de rutes.

Solució 2.

operador@srv-tramontana:~$ sudo grep -rIlF --exclude-dir=.git '5432' /etc 2>/dev/null
/etc/tramontana/app.conf
/etc/postgresql/16/main/postgresql.conf
operador@srv-tramontana:~$ sudo grep -rIhoF '5432' /etc 2>/dev/null | wc -l
7

-r gestiona el recorregut internament, així que no hi ha cap canonada per trencar: el problema dels noms amb espais ni tan sols es planteja. És la primera lliçó de la solució: si grep -r et basta, no muntis find | xargs. -I descarta binaris, -F tracta 5432 com a literal (és un número, no hi ha metacaràcters, però és més ràpid i explícit), i 2>/dev/null silencia els avisos de permís denegat en subdirectoris d'/etc que ni tan sols amb sudo interessen. Per comptar, -h suprimeix el nom del fitxer i -o emet una línia per coincidència, de manera que wc -l compta aparicions i no línies que en contenen alguna.

Solució 3. Primer la verificació que no es pot saltar:

operador@srv-tramontana:~$ readlink /opt/tramontana/app
releases/3.2.1

L'actiu és 3.2.1, per tant 3.1.0 no és l'actiu. Aquesta comprovació va sempre abans, perquè l'enllaç app és l'única font de veritat sobre quin release està servint: fiar-se de la memòria o del número més alt és com s'esborra un release en producció. I cal fer-la ara, no ahir.

operador@srv-tramontana:~$ du -sh /opt/tramontana/releases/3.1.0
97M     /opt/tramontana/releases/3.1.0
operador@srv-tramontana:~$ find /srv/tramontana/backups/temporals -type f -name '*.tmp' -mtime +7 \
    -printf '%TY-%Tm-%Td %8s %p\n'
2026-08-02  4096 /srv/tramontana/backups/temporals/export-1.tmp
2026-08-05  8192 /srv/tramontana/backups/temporals/export-2.tmp

Total a alliberar: 97 MiB més 12 KiB. Les ordres que executaríem, ja validades per les llistes anteriors:

# sudo rm -rf /opt/tramontana/releases/3.1.0
# find /srv/tramontana/backups/temporals -type f -name '*.tmp' -mtime +7 -delete

Estan comentades a propòsit: l'exercici demanava preparar-les. Fixa't que la segona ordre és literalment la mateixa que la de la verificació amb -delete afegit al final. Aquest és el procediment correcte: no s'escriu una ordre nova per esborrar, s'afegeix l'acció a l'ordre que ja has vist funcionar. Qualsevol canvi en el patró entre la comprovació i l'esborrat invalida la comprovació.

Conclusió

Ja no navegues un servidor: l'interrogues.

  • Tries entre les tres: locate per a «on és», find per filtrar per propietats del fitxer, grep per buscar contingut. I coneixes el defecte de locate: és una foto d'ahir fins al següent updatedb.
  • Domines find <rutes> <criteris> <accions> i els criteris per nom, tipus, mida, temps, propietari, permisos i profunditat, amb les tres formes de -perm i les posicionals col·locades on han d'anar.
  • Entens de debò -mtime +7 i saps que l'alternativa robusta és ! -newer sobre un fitxer de referència.
  • Combines criteris amb -o, ! i parèntesis escapats, sabent per què l'agrupació no és opcional.
  • Fas servir -exec ... + en comptes de \; perquè la diferència és d'un ordre de magnitud; coneixes -execdir, i apliques -delete només després d'haver vist la llista.
  • Tens interioritzat el patró canònic find ... -print0 | xargs -0 i maneges xargs amb -n, -I{}, -P i --no-run-if-empty.
  • Maneges grep amb context, recursivitat, -o, -F per a literals i -q com a test encadenable, i coneixes rg com a alternativa ràpida que no sempre estarà instal·lada.
  • I has resolt quatre problemes reals: quantificar els releases purgables sense tocar l'actiu, inventariar els .bak-*, trobar una credencial exposada en una còpia oblidada —amb la conclusió honesta que esborrar-la no n'hi ha prou i cal rotar la contrasenya— i comptar els errors d'errors.log per tipus.

En diverses d'aquestes ordres has fet servir 2>/dev/null, | i > sense que ningú t'hagi explicat del tot què són. Això s'acaba a la lliçó següent. Canonades i Redirecció desmunta la mecànica: els tres fluxos estàndard i per què existeixen, com veure'ls a /proc, què és realment una canonada, la diferència entre &>fitxer, >fitxer 2>&1 i el clàssic error 2>&1 >fitxer que gairebé tothom comet, i el patró | sudo tee per escriure en fitxers protegits. En acabar-la hauràs deixat d'encadenar ordres per imitació i començaràs a compondre-les sabent exactament per on circula cada byte.

Curs de Linux: De Principiant a Administrador de Sistemes

Mòdul 1: Introducció a Linux

Mòdul 2: Comandes Bàsiques de Linux

Mòdul 3: Habilitats Avançades en la Línia de Comandes

Mòdul 4: Scripting en Shell

Mòdul 5: Administració del Sistema

Mòdul 6: Xarxes i Seguretat

Mòdul 7: Temes Avançats

Mòdul 8: Projectes Pràctics

© Copyright 2026. Tots els drets reservats