Opérations sur les fichiers et les répertoires

LinuxBeginner
Pratiquer maintenant

Introduction

Linux organise les fichiers dans une arborescence unique qui commence par /, le répertoire racine. Chaque fichier et chaque répertoire possède un chemin qui indique son emplacement dans cette arborescence. Savoir lire et utiliser les chemins facilite presque toutes les tâches Linux ultérieures.

Dans ce laboratoire, vous allez créer un petit espace de travail tout en apprenant les opérations utilisées quotidiennement dans le terminal. Vous parcourrez des répertoires, créerez et modifierez des fichiers, copierez et déplacerez des données, rechercherez des fichiers, examinerez les métadonnées et les inodes, expérimenterez les liens physiques et symboliques, puis comparerez des fichiers et des arborescences de répertoires avec diff.

Explorer l’arborescence des répertoires Linux

Dans cette étape, vous allez identifier votre emplacement actuel, examiner d’importants répertoires de premier niveau et créer un espace de travail dédié pour la suite du laboratoire.

La commande pwd signifie « print working directory » (afficher le répertoire de travail). Exécutez-la en premier pour connaître le répertoire dans lequel le terminal a démarré :

pwd

Le résultat doit être /home/labex/project. Un chemin absolu commence par / et décrit un emplacement à partir de la racine du système de fichiers.

Affichez le premier niveau du système de fichiers :

ls /

Vous verrez des répertoires standard tels que etc, home, tmp, usr et var. Leurs fonctions courantes sont les suivantes :

  • /etc contient la configuration globale du système.
  • /home contient les répertoires personnels des utilisateurs ordinaires.
  • /tmp contient les données temporaires.
  • /usr contient de nombreux programmes installés et des ressources partagées.
  • /var contient des données susceptibles de changer, comme les journaux et les caches.

L’option -d indique à ls de décrire les répertoires indiqués au lieu d’en afficher le contenu. L’option -l sélectionne le format détaillé :

ls -ld /etc /home /tmp /usr /var

Le premier caractère de chaque ligne est d, ce qui indique que l’objet est un répertoire. Les colonnes restantes contiennent les permissions, le propriétaire, la taille, la date et le nom.

Créez un espace de travail pour ce laboratoire. L’option -p permet à mkdir de créer les répertoires parents manquants et évite une erreur si le répertoire existe déjà :

mkdir -p /home/labex/project/file-ops-lab

Entrez dans ce répertoire et vérifiez votre nouvel emplacement :

cd /home/labex/project/file-ops-lab
pwd

La sortie finale doit être /home/labex/project/file-ops-lab.

Se déplacer avec des chemins absolus et relatifs

Dans cette étape, vous allez créer une arborescence de répertoires imbriqués et vous y déplacer à l’aide de chemins absolus, de chemins relatifs et de raccourcis de navigation.

Commencez dans l’espace de travail du laboratoire :

cd /home/labex/project/file-ops-lab

Créez trois répertoires imbriqués en une seule commande :

mkdir -p navigation/alpha/beta

Ici, navigation/alpha/beta est un chemin relatif, car il ne commence pas par /. Le shell le résout à partir du répertoire courant.

Utilisez un chemin absolu pour entrer dans le répertoire le plus profond :

cd /home/labex/project/file-ops-lab/navigation/alpha/beta
pwd

Le chemin spécial .. désigne le répertoire parent. Déplacez-vous de beta vers alpha :

cd ..
pwd

La sortie doit se terminer par /navigation/alpha. La commande cd - vous ramène au répertoire de travail précédent :

cd -
pwd

Vous devez être de nouveau dans beta. Enfin, ~ représente votre répertoire personnel. Utilisez-le au début d’un chemin pour revenir à l’espace de travail du laboratoire :

cd ~/project/file-ops-lab
pwd

Les chemins absolus fonctionnent depuis n’importe quel emplacement. Les chemins relatifs sont plus courts lorsque vous connaissez déjà votre emplacement actuel.

Créer des répertoires et écrire dans des fichiers

Dans cette étape, vous allez créer des répertoires et des fichiers, puis apprendre la différence entre le remplacement du contenu et son ajout avec la redirection du shell.

Commencez dans l’espace de travail du laboratoire et créez deux répertoires à la fois :

cd /home/labex/project/file-ops-lab
mkdir documents archive

La commande touch crée un fichier vide lorsque le fichier indiqué n’existe pas :

touch documents/empty.txt

Examinez le fichier vide avec le format d’affichage détaillé :

ls -l documents/empty.txt

Sa taille doit être de 0 octet. Ensuite, > redirige la sortie d’une commande vers un fichier. Il crée le fichier ou remplace son contenu précédent :

echo "Linux file practice" > documents/notes.txt

L’opérateur >> ajoute la sortie sans supprimer le contenu existant :

echo "Paths identify each filesystem object" >> documents/notes.txt

Affichez le fichier complet avec cat :

cat documents/notes.txt

Vous devez voir deux lignes, dans leur ordre d’origine. Utilisez wc -l pour les compter ; -l demande à wc de compter les lignes :

wc -l documents/notes.txt

Le premier champ doit être 2.

Copier, déplacer, renommer et supprimer des fichiers

Dans cette étape, vous allez pratiquer les quatre opérations courantes qui modifient les objets du système de fichiers : copier, déplacer, renommer et supprimer.

Revenez à l’espace de travail du laboratoire :

cd /home/labex/project/file-ops-lab

La commande cp copie une source vers une destination. Copiez notes.txt dans l’archive en lui donnant un nouveau nom :

cp documents/notes.txt archive/notes-backup.txt

Vérifiez que la source et la copie existent toutes les deux :

ls -l documents/notes.txt archive/notes-backup.txt

Créez un fichier temporaire, puis utilisez mv pour le déplacer et le renommer en une seule opération :

echo "draft" > documents/draft.txt
mv documents/draft.txt archive/final-draft.txt

L’ancien chemin ne doit plus exister, tandis que le nouveau doit être présent :

ls -l archive/final-draft.txt

Pour copier un répertoire et tout son contenu, utilisez l’option récursive -r :

cp -r documents archive/documents-copy
find archive/documents-copy -maxdepth 1 -type f

La commande rm supprime définitivement les fichiers ; le terminal ne possède pas de corbeille. Créez puis supprimez un fichier destiné à être jeté :

touch disposable.tmp
rm disposable.tmp

Affichez le répertoire courant pour vérifier que le chemin a disparu :

ls

disposable.tmp ne doit pas apparaître. Vérifiez toujours attentivement un chemin avant d’utiliser rm.

Afficher, mettre à jour et rechercher des fichiers

Dans cette étape, vous allez créer un fichier comportant plusieurs lignes, examiner différentes parties de ce fichier, le mettre à jour avec une redirection en ajout et le rechercher par son nom.

Revenez à l’espace de travail du laboratoire. Un here-document envoie plusieurs lignes à une commande jusqu’à ce que le shell atteigne une ligne contenant uniquement le marqueur choisi, ici EOF :

cd /home/labex/project/file-ops-lab
cat > documents/journal.txt <<'EOF'
First entry: created a workspace
Second entry: practiced paths
Third entry: copied files
EOF

Les guillemets autour de 'EOF' empêchent le shell de développer les caractères spéciaux présents dans le document. Affichez le fichier avec les numéros de ligne :

nl -ba documents/journal.txt

L’option -ba numérote toutes les lignes. Utilisez head -n 2 pour afficher les deux premières lignes et tail -n 1 pour afficher la dernière :

head -n 2 documents/journal.txt
tail -n 1 documents/journal.txt

Ajoutez une quatrième entrée. Vous avez utilisé >> plus tôt ; cet opérateur ajoute la sortie à la fin sans remplacer les trois lignes existantes :

echo "Fourth entry: reviewed the results" >> documents/journal.txt

Vérifiez le résultat :

tail -n 2 documents/journal.txt

Recherchez maintenant les fichiers texte dans l’espace de travail. Avec find, . désigne le répertoire courant, -type f limite les résultats aux fichiers ordinaires et -name recherche selon un motif de nom de fichier. Les guillemets empêchent le shell de développer *.txt avant que find ne le reçoive :

find . -type f -name "*.txt"

La sortie doit inclure ./documents/journal.txt ainsi que les autres fichiers texte que vous avez créés.

Examiner les types de fichiers, les métadonnées et les inodes

Dans cette étape, vous allez aller au-delà du nom d’un fichier et examiner les informations que Linux stocke à propos d’un objet du système de fichiers.

Commencez dans l’espace de travail du laboratoire et demandez à file d’identifier deux objets différents :

cd /home/labex/project/file-ops-lab
file documents/journal.txt /bin/ls

Le journal est identifié comme du texte, tandis que /bin/ls est identifié comme un programme exécutable. Linux ne s’appuie pas uniquement sur les extensions de nom de fichier pour identifier les données.

La commande stat affiche des métadonnées telles que la taille, les permissions, le propriétaire, les horodatages et le numéro d’inode :

stat documents/journal.txt

Un inode est l’enregistrement du système de fichiers qui stocke les métadonnées d’un fichier et pointe vers ses données. Un nom de fichier est une entrée de répertoire qui fait référence à un inode. Utilisez un format stat personnalisé pour afficher des champs stables :

stat -c 'name=%n type=%F size=%s inode=%i links=%h' documents/journal.txt

Le champ %i correspond au numéro d’inode, tandis que %h indique le nombre de liens physiques qui font référence à cet inode.

L’option -i de ls affiche également les numéros d’inode. Créez un fichier d’exercice sur les métadonnées et examinez-le :

echo "inode practice" > metadata-sample.txt
ls -li metadata-sample.txt

Le nombre au début de la ligne est le numéro d’inode. Il peut varier selon les environnements ; concentrez-vous donc sur la signification de ce champ plutôt que sur sa valeur.

Utiliser des liens physiques et des liens symboliques

Dans cette étape, vous allez créer les deux types de liens Linux et observer le comportement de chacun lorsque le nom de fichier d’origine est supprimé.

Créez un répertoire et un fichier source pour l’expérience :

cd /home/labex/project/file-ops-lab
mkdir links
echo "shared inode data" > links/source.txt

La commande ln sans option crée un lien physique. Les deux noms font référence au même inode et aux mêmes données de fichier :

ln links/source.txt links/hard-link.txt

L’option -s crée un lien symbolique, parfois appelé symlink. Un lien symbolique stocke le chemin vers un autre fichier :

ln -s source.txt links/symbolic-link.txt

Comparez les numéros d’inode et les informations sur les liens :

ls -li links

source.txt et hard-link.txt doivent avoir le même numéro d’inode. Le lien symbolique possède son propre inode et affiche -> source.txt.

Utilisez readlink pour afficher le chemin stocké dans le lien symbolique :

readlink links/symbolic-link.txt

Supprimez le nom de fichier d’origine :

rm links/source.txt

Le lien physique permet toujours d’accéder à l’inode et à ses données :

cat links/hard-link.txt

Le lien symbolique pointe maintenant vers un nom qui n’existe plus. Essayez de le lire :

cat links/symbolic-link.txt

L’erreur No such file or directory est attendue et fournit une indication utile : l’objet lien existe toujours, mais le chemin cible qu’il contient est rompu. Cette expérience montre pourquoi la suppression d’un nom de lien physique ne supprime pas les données tant qu’un autre lien physique existe, tandis qu’un lien symbolique dépend du chemin cible qu’il contient.

Comparer des fichiers et des répertoires avec Diff

Dans cette étape, vous allez utiliser diff pour localiser les différences, puis synchroniser deux petites arborescences de répertoires.

Créez deux répertoires de version :

cd /home/labex/project/file-ops-lab
mkdir -p comparison/version-a comparison/version-b

Créez des fichiers de configuration qui diffèrent sur une ligne :

printf 'mode=production\nport=8080\n' > comparison/version-a/app.conf
printf 'mode=production\nport=9090\n' > comparison/version-b/app.conf

L’option -u demande à diff d’afficher une vue unifiée avec le contexte autour de chaque modification :

diff -u comparison/version-a/app.conf comparison/version-b/app.conf

diff marque les lignes du premier fichier avec - et celles du second avec +. Son code de sortie différent de zéro signifie que les fichiers diffèrent ; ce comportement est attendu.

Faites en sorte que le second fichier soit identique au premier, puis utilisez -q pour effectuer une vérification silencieuse de l’égalité :

cp comparison/version-a/app.conf comparison/version-b/app.conf
diff -q comparison/version-a/app.conf comparison/version-b/app.conf

L’absence de sortie signifie que les fichiers sont identiques. Ajoutez maintenant un fichier dans un seul des répertoires :

echo "release notes" > comparison/version-a/README.txt

L’option -r compare récursivement les arborescences de répertoires :

diff -r comparison/version-a comparison/version-b

La sortie indique que README.txt existe uniquement dans version-a. Copiez-le, puis comparez à nouveau :

cp comparison/version-a/README.txt comparison/version-b/README.txt
diff -r comparison/version-a comparison/version-b

La commande finale ne doit produire aucune sortie, ce qui prouve que les deux arborescences de répertoires contiennent désormais les mêmes fichiers et le même contenu.

Résumé

Vous avez pratiqué les principales opérations sur les fichiers et les répertoires utilisées dans le terminal Linux. Vous vous êtes déplacé avec des chemins absolus et relatifs, avez créé et modifié des fichiers, copié et déplacé des données, supprimé un fichier temporaire en toute sécurité et effectué des recherches par nom de fichier.

Vous avez également examiné les types de fichiers et leurs métadonnées, appris le lien entre les noms de fichiers et les inodes, comparé les liens physiques aux liens symboliques et utilisé diff pour comparer des fichiers individuels ainsi que des arborescences complètes de répertoires. Ces notions vous aideront à raisonner sur les fichiers Linux au lieu de considérer les commandes comme des recettes indépendantes.