Tancàvem el Mòdul 1 prometent que aquí començava «la feina de debò amb les eines», i aquesta és la primera. Crear, copiar, moure i eliminar fitxers és l'operació més freqüent de qualsevol persona que administri un sistema, i també la més perillosa: a Linux no hi ha paperera de reciclatge, i un rm mal escrit no demana confirmació ni deixa rastre. En aquesta lliçó aprendràs a manipular fitxers i directoris amb precisió sobre srv-veloz-01, a protegir la teva feina amb còpies de seguretat instantànies i a reconèixer els paranys que fan que una ordre aparentment inofensiva destrueixi dades de producció.
Contingut
- Crear directoris amb
mkdirimkdir -p - Crear i tocar fitxers amb
touch - Copiar amb
cp: les opcions que importen - Moure i reanomenar amb
mv - Eliminar amb
rmirmdir: el punt de no retorn - Noms problemàtics: espais i guions inicials
- Còpies de seguretat ràpides abans de tocar res
- Cas pràctic: organitzar
~/veloz-opsi arxivar el CSV del dia
- Crear directoris amb
mkdir i mkdir -p
mkdir i mkdir -pmkdir (make directory) crea directoris, un o uns quants per invocació. El problema apareix amb estructures imbricades:
mkdir només crea l'últim element del camí i dóna per fet que els pares existeixen. L'opció -p (parents) crea tots els intermedis que faltin:
mkdir: s'ha creat el directori '/home/joan/veloz-ops/logs/2026' mkdir: s'ha creat el directori '/home/joan/veloz-ops/logs/2026/08'
-v només esmenta el que realment ha creat: ~/veloz-ops/logs ja existia des de la lliçó 01-02.
-p té una segona virtut, encara més important en scripts: no falla si el directori ja existeix. Sense -p, repetir mkdir informes retorna error i codi de sortida diferent de 0; amb -p, retorna 0 en silenci. És una operació idempotent: executar-la una o cent vegades produeix el mateix resultat. Per això en qualsevol script seriós hi veuràs sempre mkdir -p. A més existeix -m MODE per fixar els permisos en el moment de crear el directori, tema que abordarem a 02-03.
- Crear i tocar fitxers amb
touch
touchtouch té dos usos que convé no confondre: si el fitxer no existeix, el crea buit; si ja existeix, actualitza les seves dates d'accés i modificació sense tocar-ne el contingut.
Mida 0: fitxer buit, a punt per editar. El segon ús dóna nom a l'ordre i serveix per marcar fites: molts processos de còpia de seguretat decideixen què copiar comparant dates, i un touch torna a incloure el fitxer. Opcions útils: -c (no crear-lo si no existeix), -d "2026-07-01 09:00" (fixar una data concreta) i -r REF (copiar les dates d'un altre fitxer).
touch no crea fitxers amb contingut. Per a això faràs servir un editor o, a partir de 02-04, la redirecció.
- Copiar amb
cp: les opcions que importen
cp: les opcions que importenLa sintaxi és cp ORIGEN DESTÍ, però el comportament canvia segons si el destí existeix i és un directori:
cp enviaments.csv enviaments-copia.csv # destí = nom de fitxer → còpia reanomenada
cp enviaments.csv /tmp/ # destí = directori → /tmp/enviaments.csv
cp a.csv b.csv c.csv /tmp/backup/ # diversos orígens → el destí HA DE SER un directoriSi el destí és un fitxer que ja existeix, cp el sobreescriu sense avisar. Aquest és el primer parany seriós del dia.
| Opció | Nom | Què fa |
|---|---|---|
-r / -R |
recursive | Copia directoris amb tot el seu contingut |
-a |
archive | Copia «tal qual»: recursiu + preserva metadades + enllaços simbòlics |
-i |
interactive | Pregunta abans de sobreescriure |
-n |
no-clobber | Mai no sobreescriu, i no pregunta |
-v |
verbose | Mostra cada fitxer copiat |
-u |
update | Copia només si l'origen és més nou, o el destí no existeix |
Sense -r, copiar un directori falla amb cp: s'omet el directori '...'.
Què preserva exactament -a
-a equival a -dR --preserve=all, i aquesta expansió n'explica el valor. Preserva:
- Mode (permisos): un script executable ho continua sent a la còpia.
- Propietari i grup, si tens privilegis per assignar-los.
- Marques de temps: la còpia conserva la data original, no la d'avui.
- Enllaços simbòlics: els copia com a enllaços en lloc de seguir-los i duplicar dades.
Compara-ho amb -r a seques, que crea fitxers nous amb la data actual i els permisos filtrats per la teva umask (02-03). Per arxivar o fer còpies de seguretat, -a és gairebé sempre el correcte: vols una rèplica fidel, no una versió «acabada de fer».
'/home/joan/veloz-ops' -> '/tmp/veloz-ops-snapshot' '/home/joan/veloz-ops/bin/informe-diari.sh' -> '/tmp/veloz-ops-snapshot/bin/informe-diari.sh'
El parany del destí existent
Amb cp, el que determina el resultat no és la barra final de l'origen, sinó si el destí existeix: si /tmp/desti no existeix, cp -a origen /tmp/desti crea la còpia amb aquest nom; si existeix, crea /tmp/desti/origen a dins. (A rsync, que veuràs a 07-03, la barra final de l'origen sí que canvia el significat; confondre tots dos comportaments és un clàssic.) La manera de no equivocar-se és comprovar-ho abans amb ls -d /tmp/desti.
- Moure i reanomenar amb
mv
mvmv mou fitxers. I reanomena fitxers. I són exactament la mateixa operació: a Unix, el nom d'un fitxer no és res més que una entrada en un directori que apunta a les seves dades. Moure dins del mateix sistema de fitxers consisteix a esborrar aquesta entrada del directori d'origen i crear-la al de destí; si el directori és el mateix i només canvia el text de l'entrada, en diem «reanomenar».
mv informe.txt informe-2026-08-03.txt # reanomenar
mv informe-2026-08-03.txt ~/veloz-ops/logs/ # moure
mv esborrany.md ~/veloz-ops/logs/final.md # moure i reanomenar alhoraConseqüència pràctica: moure dins del mateix disc és instantani, encara que siguin 50 GB, perquè no es copien dades. Moure entre discos diferents sí que implica copiar i esborrar, i per això triga.
Igual que cp, mv sobreescriu sense preguntar. -i pregunta abans de sobreescriure; -n no sobreescriu mai i no pregunta; -v mostra què fa.
En scripts, -n és preferible a -i: un script no s'ha de quedar esperant una resposta que ningú no teclejarà.
- Eliminar amb
rm i rmdir: el punt de no retorn
rm i rmdir: el punt de no retornLlegeix aquesta secció dues vegades. rm és l'ordre que més dades ha destruït en la història d'Unix.
rm fitxer.txt # esborra un fitxer
rm -r directori/ # esborra un directori i tot el seu contingut
rm -i *.tmp # pregunta per cadascun
rm -f fitxer # força: no pregunta ni protesta si no existeix
rmdir directori-buit # esborra un directori NOMÉS si és buitNo hi ha paperera. rm desvincula el nom i l'espai queda disponible per reutilitzar-se. La recuperació no és una operació d'usuari: exigeix eines forenses, desmuntar el sistema de fitxers i tot i així sol fracassar. Treballa sempre amb el supòsit que allò que esborres se n'ha anat.
rmdir és el complement segur: com que només esborra directoris buits, no pot destruir contingut per accident. Fes-lo servir quan la teva intenció sigui «netejar alguna cosa que ja hauria de ser buida»: si falla, és que hi havia alguna cosa inesperada, i això és informació valuosa.
Els paranys dels camins mal escrits
rm -rf /srv/veloz/dades /historic # ← espai de més: esborra dades I /historic
rm -rf ~/veloz-ops /logs # ← el mateix error, disfressat
rm -rf $DIR/* # ← si DIR és buida, això és rm -rf /*L'espai accidental converteix un argument en dos, i rm esborra tots dos sense immutar-se. El tercer cas és la raó per la qual al Mòdul 3 aprendràs a posar les variables entre cometes i a donar-los valors per defecte.
Hàbits que et protegeixen, aplicant el que has après a 01-05:
ls -la /srv/veloz/dades/historic/2026/07 # 1. mirar primer què hi ha
echo rm -rf /srv/veloz/dades/historic/2026/07 # 2. imprimir sense executar i rellegir
rm -rf /srv/veloz/dades/historic/2026/07 # 3. executar només si era correcteI dues regles més en producció: no facis servir mai rm -rf amb sudo sense haver llistat abans, i és preferible moure a un directori de quarantena quan l'operació no sigui trivialment reversible.
- Noms problemàtics: espais i guions inicials
El shell separa els arguments per espais, així que informe agost.txt es veu com dos arguments. La solució són les cometes o l'escapament:
Encara pitjor és un fitxer el nom del qual comença per guió:
rm interpreta el nom com a opcions agrupades. Hi ha dues solucions estàndard:
rm -- -fitxer-estrany.txt # -- marca el final de les opcions
rm ./-fitxer-estrany.txt # amb ./ al davant ja no comença per guióEl separador -- l'accepten gairebé tots els programes GNU i significa: «el que vingui després són arguments, no opcions». També et salvarà quan un patró de cerca comenci per guió.
Sobre accents i ñ: el sistema de fitxers els admet, però si aquests noms acaben en una URL, en un script portable o en un sistema Windows donaran guerra. Per al toolkit de Veloz Envíos adoptem una convenció estricta: minúscules, sense accents, guions en lloc d'espais.
- Còpies de seguretat ràpides abans de tocar res
Abans d'editar un fitxer de configuració en producció, fes-te aquesta còpia. Costa un segon i estalvia tardes senceres:
cp -a ~/veloz-ops/etc/veloz-ops.conf ~/veloz-ops/etc/veloz-ops.conf.bak
# Si necessites diverses còpies successives, posa la data al nom (substitució d'ordres, 03-06)
cp -a veloz-ops.conf "veloz-ops.conf.$(date +%F).bak" # → veloz-ops.conf.2026-08-03.bak-a és deliberat: la còpia conserva permisos i data original, així que serveix com a referència de «com estava això». Això és una còpia local: protegeix davant dels teus propis errors d'edició, no davant d'una fallada de disc. La còpia de seguretat real de Veloz Envíos, amb tar i rsync, arribarà a 05-01 i 07-03.
- Cas pràctic: organitzar
~/veloz-ops i arxivar el CSV del dia
~/veloz-ops i arxivar el CSV del dia# 1. Completar l'estructura del toolkit
mkdir -pv ~/veloz-ops/{bin,lib,etc,logs,tmp}
# 2. Crear el fitxer de configuració i la seva còpia de seguretat
touch ~/veloz-ops/etc/veloz-ops.conf
cp -a ~/veloz-ops/etc/veloz-ops.conf ~/veloz-ops/etc/veloz-ops.conf.bak
# 3. Preparar l'arxiu històric de dades per any i mes
sudo mkdir -pv /srv/veloz/dades/historic/2026/08
# 4. Arxivar una instantània del CSV del dia, conservant metadades
sudo cp -av /srv/veloz/dades/enviaments.csv \
/srv/veloz/dades/historic/2026/08/enviaments-2026-08-03.csvLa sintaxi {bin,lib,...} és expansió de claus i l'estudiarem a 02-05; de moment queda't amb què crea els cinc directoris d'una passada. La barra invertida final del pas 4 permet continuar l'ordre a la línia següent.
Fixa't en la decisió de disseny: copiem, no movem. /srv/veloz/dades/enviaments.csv és el fitxer viu que l'API continua escrivint; moure'l trencaria l'aplicació. L'històric s'alimenta de còpies datades, i el nom enviaments-2026-08-03.csv és deliberadament ordenable alfabèticament, que aquí equival a ordenable cronològicament.
L'hora que es mostra, 09:14, és la del fitxer original, no la de la còpia: això és -a fent la seva feina.
Errors Habituals i Consells
- Creure que
cpimvavisen abans de sobreescriure. No ho fan. De manera interactiva pots definiralias cp='cp -i'ialias mv='mv -i'al teu~/.bashrc(02-06), però no en depenguis: els àlies no s'expandeixen en scripts, i acostumar-te a la xarxa de seguretat fa que abaixis la guàrdia en màquines alienes. - Fer servir
-rquan volies-a. Copiar~/veloz-opsamb-rdeixa els scripts amb la data d'avui i, en alguns casos, sense el bit d'execució. - Oblidar que
rm -rno pregunta.rm -ri directori/pregunta pas a pas; és lent, però en producció aquesta lentitud és una virtut. - Escriure el camí amb un espai de més. Abans de qualsevol esborrat recursiu, posa-hi
echoal davant i llegeix el resultat. - Deduir el destí de
cpper la barra final. Comprova ambls -dsi existeix. - Omplir el disc de
.bak. Les còpies ràpides són per al moment; neteja les que ja no serveixen o acabaràs depurant undfal 100 %.
Exercicis
Exercici 1 — Muntar l'arxiu mensual. Prepara l'arxiu històric de juliol de 2026 i col·loca-hi dins una còpia de les dades actuals sense tocar el fitxer viu: (1) crea /srv/veloz/dades/historic/2026/07 en una sola ordre encara que faltin els pares; (2) copia-hi enviaments.csv com a enviaments-2026-07-31.csv preservant permisos i dates i mostrant què fa; (3) comprova que l'original continua al seu lloc; (4) explica per què -a és preferible a una còpia simple.
Exercici 2 — Netejar un desastre de noms. Un script mal escrit ha deixat a ~/veloz-ops/tmp els fitxers informe agost.txt, -tmp.log i resum.txt. Reanomena el primer a informe-agost.txt; esborra -tmp.log raonant per què rm -tmp.log falla; i mou resum.txt a ~/veloz-ops/logs/ sense sobreescriure res si ja n'hi hagués un amb aquest nom.
Exercici 3 — Auditar una ordre perillosa. Un company et passa això per «netejar l'històric antic» i et demana que ho revisis abans d'executar-ho com a root:
Què fa realment? Quina era la intenció? Escriu una seqüència segura que aconsegueixi la intenció real.
Solucions
Solució a l'Exercici 1
sudo mkdir -p /srv/veloz/dades/historic/2026/07
sudo cp -av /srv/veloz/dades/enviaments.csv \
/srv/veloz/dades/historic/2026/07/enviaments-2026-07-31.csv
ls -l /srv/veloz/dades/enviaments.csv-p és imprescindible perquè falten dos nivells intermedis. -a és preferible perquè un arxiu històric ha de ser una rèplica fidel: si la còpia rebés la data d'avui perdríem la informació de quan es van generar les dades, que és justament el que un històric existeix per conservar. A més conserva els permisos, i evita que una auditoria futura trobi diferències sense explicació.
Solució a l'Exercici 2
cd ~/veloz-ops/tmp
mv "informe agost.txt" informe-agost.txt
rm -- -tmp.log
mv -n resum.txt ~/veloz-ops/logs/rm -tmp.log falla perquè el shell lliura la cadena -tmp.log a rm i aquest la interpreta com a opcions agrupades (-t, -m, -p...). El separador -- li indica que no esperi més opcions; rm ./-tmp.log funciona igual de bé. A l'últim pas, -n garanteix que no es perdi un resum.txt preexistent i, a diferència de -i, no bloqueja l'execució esperant resposta.
Solució a l'Exercici 3
-
Què fa realment: l'espai abans de
/2025converteix l'ordre en dos arguments. Esborra recursivament tot/srv/veloz/dades/historic—l'arxiu històric complet, tots els anys— i intenta a més esborrar el directori/2025a l'arrel. Ambsudoi-f, sense ni una sola pregunta ni missatge d'error. -
La intenció era esborrar el subdirectori de l'any 2025:
/srv/veloz/dades/historic/2025. -
Seqüència segura:
ls -la /srv/veloz/dades/historic/2025 # 1. confirmar camí i contingut
du -sh /srv/veloz/dades/historic/2025 # 2. el volum quadra amb el que s'esperava?
echo sudo rm -rf /srv/veloz/dades/historic/2025 # 3. imprimir sense executar i rellegir
# 4. Alternativa preferible en producció: quarantena en lloc d'esborrat
sudo mkdir -p /srv/veloz/quarantena
sudo mv -n /srv/veloz/dades/historic/2025 /srv/veloz/quarantena/La quarantena és la millora clau: converteix una operació irreversible en reversible. Passades unes setmanes sense incidències, l'esborrat definitiu es fa amb tranquil·litat. Quan aprenguis find i tar a 05-01 aquest flux s'automatitzarà, però el criteri continuarà sent el mateix.
Conclusió
Ja domines la manipulació bàsica del sistema de fitxers: crees estructures completes amb mkdir -p, generes fitxers amb touch, copies amb fidelitat fent servir cp -a, entens que moure i reanomenar són la mateixa operació i —el més important— has interioritzat que rm no perdona. Saps tractar noms amb espais i amb guions inicials mitjançant cometes i --, tens l'hàbit de la còpia .bak abans d'editar res, i has deixat ~/veloz-ops i l'arxiu històric de /srv/veloz/dades organitzats per a la resta del curs.
Encara manipules els fitxers un a un o pel nom complet; seleccionar-los per patrons arribarà a 02-05 amb els comodins, i les cerques complexes a 05-01 amb find.
A la lliçó següent, 02-02, deixem de moure fitxers per començar a llegir què hi ha a dins. Aprendràs a explorar /var/log/veloz/app.log en directe, a buscar errors amb grep, a extreure columnes d'enviaments.csv i a ordenar i comptar resultats. És el moment en què les dades de Veloz Envíos comencen a respondre preguntes.
Curs de Programació en Bash
Mòdul 1: Introducció a Bash
- Què és Bash?
- Configurar el teu Entorn
- Navegació Bàsica per la Línia d'Ordres
- Entendre el Shell
- Trobar Ajuda: man, help i --help
Mòdul 2: Ordres Bàsiques de Bash
- Operacions amb Fitxers i Directoris
- Ordres de Processament de Text
- Permisos i Propietat dels Fitxers
- Redirecció i Canonades
- Comodins i Expansió de Rutes
- Historial i Dreceres de Teclat
Mòdul 3: Fonaments de Scripting
- Crear i Executar un Script
- Variables i Constants
- Operadors Bàsics
- Sentències Condicionals
- Arguments i Entrada de l'Usuari
- Cometes, Expansió i Substitució
Mòdul 4: Scripting Intermedi
- Bucles en Bash
- Funcions en Bash
- Arrays i Arrays Associatius
- Manipulació de Cadenes
- La Sentència case i els Menús Interactius
- Aritmètica i Càlculs Numèrics
Mòdul 5: Tècniques Avançades de Scripting
- Operacions Avançades amb Fitxers
- Gestió de Processos
- Gestió d'Errors i Depuració
- Expressions Regulars
- Entrada/Sortida Avançada: Descriptors i Here-Documents
- Scripts Modulars i Llibreries Reutilitzables
Mòdul 6: Treballar amb Eines Externes
Mòdul 7: Automatització i Programació
- Tasques Cron
- Automatitzar Tasques
- Scripts de Còpia i Restauració
- Monitoratge i Registre
- Serveis i Temporitzadors amb systemd
- Automatització Remota amb SSH
Mòdul 8: Bones Pràctiques i Optimització
- Escriure Codi Llegible
- Optimitzar Scripts en Bash
- Consideracions de Seguretat
- Control de Versions amb Git
- Anàlisi Estàtica amb ShellCheck i shfmt
- Proves Automatitzades amb Bats
- Portabilitat: POSIX sh enfront de Bashismes
