Manipuler les fichiers et dossiers en console

Quand on ouvre une console on se trouve généralement à la racine de notre répertoire personnel. En supposant que je sois l'utilisateur user je sais que mon répertoire personnel se trouve (en partant de la racine du disque dur) dans /home/user.

user@machine:~$

Vous remarquerez qu'il n'est pas indiqué user@machine:/home/user$ (c'est pourtant la réalité) mais user@machine:~$, en fait le caractère tilde (~) représente le répertoire personnel de l'utilisateur connecté.

Tapez la commande pwd (print working directory) affichera bien /home/user, l'endroit où vous vous trouvez.

Le caractère dollar ($) signifie que nous sommes connecté en tant que simple utilisateur, quand nous nous connecterons en tant que super utilisateur (root) la console affichera un caractère dièse (#).

cd: Se déplacer dans les répertoires

Quand on souhaite passer d'un répertoire à un autre on utilise la commande cd (commande directory).

Sortir du répertoire courant vers le premier répertoire parent:

user@machine:~$ cd ..
user@machine:/home$

Retourner dans le répertoire enfant user (notre répertoire personnel)

user@machine:/home$ cd user
user@machine:~$

Notez bien que je n'ai pas écrit /user mais bien user sans /, si j'avais fait cela Linux aurait compris que je souhaite partir de la racine du disque dur /. Ce genre d'erreur retourne un message très clair: bash: cd: /user: Aucun fichier ou dossier de ce type

on aurai aussi pu faire comme ça

user@machine:/home$ cd ~
user@machine:~$

Sortir du répertoire courant vers le répertoire racine (celui qui contient tout les autres)

user@machine:~$ cd ../..
user@machine:/$

on aurai aussi pu faire comme ça

user@machine:~$ cd /
user@machine:/$

Pour retourner dans notre répertoire personnel (sans utiliser ~)

user@machine:/$ cd /home/user
user@machine:~$

La touche [tab] (tabulation) permet d'auto compléter des commandes partiellement écrites, c'est très pratique quand les noms de fichiers ou de répertoires sont plus longs que ceux ci-dessus.

Quand vous effectuez des allez et retours d'un répertoire à un autre il peut être pratique d'utiliser la commande cd - plutôt que de retaper les chemins chaque fois.

user@machine:~$ cd Vidéos/
user@machine:~/Vidéos$
user@machine:~/Vidéos$ cd ~/Téléchargements/
user@machine:~/Téléchargements$
user@machine:~/Téléchargements$ cd -
user@machine:~/Vidéos$
user@machine:~/Vidéos$ cd -
user@machine:~/Téléchargements$

ls: Lister le contenu des répertoires

Utilisée sans option ni argument ls retournera sans distinction la liste des fichiers et des répertoires (non cachés) du répertoire courant

user@machine:~$ ls
bin          images     test.txt
documents    music      test2
downloads    test

dans cet exemple il est difficile de distinguer les fichiers des répertoires (sous Linux les fichiers n'ont pas forcément d'extension) de plus on ne vois pas les fichiers et dossiers cachés (.fichier .dossier).
Voici quelques options indispensables (liste non exhaustive)

comme la plupart des options il est possible de les combiner: ls -lar ou ls -l -a -r sont équivalentes.

Il en existe bien d'autres mais ce sont selon moi les plus utilisées.

Exécutez la commande ls -l et regardez le premier caractère de chaque ligne:

Les trois premiers types sont ceux que l'on manipule le plus fréquemment.

Exécutez la commande ls -F et regardez le dernier caractère de chaque élément:

voir aussi ces 3 astuces qui combinent ls avec d'autres commandes.

touch : Date de modification des fichiers

Utilisée sans option sur un fichier, la commande touch appliquera à ce dernier la date courante du système comme date de dernière modification.

Grâce à l'option -t il est possible d'affecter une date choisie. La syntaxe est la suivante:
[[SS]AA]MMJJhhmm[.ss]

SS est le siècle (19 ou 20), peut être ignoré, dans ce cas utilisera le siècle courant.
AA est l'année de 00 à 99, peut être ignoré si SS à été ignoré.
MM le mois 01 à 12
JJ le jour 01 à 31
hh l'heure de 00 à 23
mm les minutes de 00 à 59
.ss les secondes de 00 à 59, peut être ignoré (00)

Il est impératif d'utiliser le zéro si le nombre est inférieur à 10 (01, 02, ...)

Les trois commandes ci-dessous sont équivalentes.

$ touch -t 202110050633.00 fichier.txt
$ touch -t 2110050633.00 fichier.txt
$ touch -t 2110050633 fichier.txt
$ ls -l  
-rw-r--r-- 1 user user 1789  5 oct.   2021 fichier.txt

La commande touch n'a pas pour vocation de créer des fichiers mais elle peut le faire.

Cré le fichier txt1

$ touch txt1

Cré les fichiers txt1 et txt2

$ touch txt1 txt2

Cré un fichier dont le nom comporte un espace

$ touch "mon txt"

Cré le fichier txt1 avec le texte "bonjour tout le monde" comme contenu.

$ echo "bonjour tout le monde" > txt1

mkdir: Créer des dossiers

Crée un dossier nommé "folder"

$ mkdir folder

Crée deux dossiers d'un même coup au même niveau

$ mkdir folder1 folder2 

Créer une arborescence de dossiers

$ mkdir -p fdr1/fdr2/fdr3

cat: Lire des petits fichiers

Lecture de tout un fichier

$ cat

Pareil mais avec les numéros de ligne

$ cat -n

Plus puissant qu'il n'y parait

Utiliser cat pour écrire directement dans un fichier

cat > rep/fichier.txt << "EOF"
... ligne 1 ...
... ligne 2 ...
...
EOF

obtenir le nombre de coeurs processeur

cat /proc/cpuinfo | grep -c ^processor

Créer une image.iso d'un cd/dvd

$ cat /dev/cdrom > ~/img.iso

À vérifier mais mon lecteur cd ne fonctionne plus!

less: Lire des gros fichiers

lecture d'un fichier page par page

$ less grosFichier

raccourcis clavier:
Espace : page suivante
Entré : ligne suivante
d : demi page suivante
b : page précédente ( pg up )
y : une ligne en arrière ( flèche haut )
u : demi page précédente
q : quitter
= : affiche la position dans le fichier
h : aide ( q pour sortir )
/ : /motAchercher (regex possible)
n : suite à une recherche, recherche l'occurrence suivante
N : pareil que n mais en remontant le sens de lecture

head: Lire une partie d'un fichier

Lire le début d'un fichier

$ head nom-fichier

Lire les 3 premières lignes d'un fichier

$ head -n 3 nom-fichier

tail: Lire une partie d'un fichier

Lire la fin d'un fichier

$ tail nom-fichier

Afficher les trois dernières lignes d'un fichier

$ tail -n 3 nom-fichier

Affiche si le fichier évolue

$ tail -f nom-fichier

Pareil mais avec un rafraîchissement de 2 secondes

$ tail -f -s 2 nom-fichier

Quitter tail

[CTRL]+[C]

cp: Copier des fichiers

Faire une copie de "fichier1" en "fichier2"

$ cp fichier1 fichier2

Fait une copie de "fichier1" vers "dossier1"

$ cp fichier1 dossier1/

Fait une copie de "fichier1" vers "dossier1" et renomme "fichier1" en "fichier2"

$ cp fichier1 dossier1/fichier2

Fait une copie de toutes les images .jpg dans "dossier1"

$ cp *.jpg dossier1/

Fait une copie de tous les fichiers qui commencent par "so" dans "dossier1"

$ cp so* dossier1

Fait une copie de "dossier1" et tout ses sous dossiers dans "dossier2"

$ cp -R dossier1 dossier2

Une manière un peu différente de faire une copie

$ cp fichier.txt{,.log}
$ ls
fichier.txt fichier.txt.log 

Deux options me semblent importantes pour la commande cp:

-a : (archive) conserve les information d'horodatage du fichier

$ cp -a fichier1.txt fichier1.1.txt
$ cp fichier1.txt fichier1.2.txt
$ ls -l
-rw-r--r-- 1 user user 1789  5 oct.  06:33 fichier1.txt
-rw-r--r-- 1 user user 1789  5 oct.  06:33 fichier1.1.txt
-rw-r--r-- 1 user user 1789  9 déc.  18:16 fichier1.2.txt

-i : (interactive) Prévient l'écrasement accidentel de fichier.

Petite astuce

Créer une arborescence de répertoires (r1/r2/r3) et ajouter à la volée fichier.txt dans le dernier répertoire (r3)

$ mkdir -p r1/r2/r3 && cp fichier.txt $_

mv: Déplacer/renommer des fichiers et/ou dossiers

Lors d'un déplacement de fichier avec la commande mv l'horodatage est préservé.

Déplace fichier1 dans dossier1

$ mv fichier1 dossier1/

Déplace(renomme) dossier1 et ses sous dossiers dans dossier2

$ mv dossier1/ dossier2/

si dossier2 existe alors dossier1 sera déplacé dans dossier2
si dossier2 n'existe pas alors dossier1 est renommé en dossier2

Déplace toutes les images .jpg vers dossier1

$ mv *.jpg dossier1/

Renomme fich en fichier1

$ mv fich fichier1

déplace et renomme fich1

$ mv fich1 dossier/fichier

En supposant que le répertoire test soit en fait un lien symbolique pointant vers un répertoire à part entière. La commande

$ mv test /home/autre/rep/

déplacera le lien symbolique, alors que

$ mv test/ /home/autre/rep/

déplacera le répertoire où pointe le lien symbolique.

rm: Supprimer des fichiers et/ou des dossiers

La commande rm supprime définitivement ce qui lui est passé en paramètre, il convient d'être extrêmement vigilent lors de son utilisation.

Supprime fichier1

$ rm fichier1

Supprime fichier1 et fichier2

$ rm fichier1 fichier2

Quelques options:

-i : demande confirmation
-f : opposé à i, supprime quoi qu'il arrive
-v : (mode verbeux) dit ce qu'il fait
-r ou -R : supprime un dossier et son contenu

Supposons un répertoire contenant cette liste de fichier:

$ ls 
bob.01-01-2016.sql.gz
bob.02-01-2016.sql.gz
bob.01-01-2015.sql.gz
bob.02-01-2015.sql.gz
joe.01-01-2016.sql.gz
joe.02-01-2016.sql.gz
joe.01-01-2015.sql.gz
joe.02-01-2015.sql.gz

Si l'on souhaite supprimer les sauvegardes de Bob il suffit de faire ça:

$ rm bob*

de même si l'on souhaite supprimer tous les fichier de 2015 il suffit de faire ça:

$ rm *15.sql.gz

ou ça:

$ rm *2015*

Au risque de me répéter, manipulez la commande rm avec précaution. Par exemple si j'avais tapé $ rm bob *, avec un espace entre bob et *, la commande aurait compris (à juste titre) qu'il faut supprimer un fichier nommé bob ainsi que tout ce qui se trouve dans le répertoire courant.
Quand c'est possible évitez les caractères spéciaux avec rm.

Utiliser rm avec les expressions régulières

Il n'est, à ma connaissance, pas possible d'utiliser rm et grep simplement avec un pipe, par contre il est possible de fournir une liste de fichiers que rm se chargera de supprimer.

Si l'on reprend l'exemple ci-dessus on peut refaire les mêmes opérations mais avec les expressions régulières.

$ ls | grep '^bob' | xargs rm

$ ls | grep '15.sql.gz$' | xargs rm

$ ls | grep '.2015.' | xargs rm

$ ls | grep '^[a-i]' | xargs rm

/!\ attention aux caractères spéciaux:

$ ls | grep -Z '^bob' | xargs -0 rm

ln: Faire des liens (raccourcis)

Liens physiques: deux noms de fichiers différents pointent vers un même contenu. Ne fonctionne pas sur les répertoires.
Liens symboliques: le lien pointe vers le nom du fichier d'origine. Fonctionne sur les répertoires.

Crée un lien physique entre fichier2 et le contenu de fichier1.

$ ln fichier1 fichier2

Crée un lien symbolique de fichier2 vers fichier1.

$ ln -s fichier1 fichier2

Créer un lien symbolique entre une clé usb et un répertoire "ma_cle"

$ ln -s -T /media/usb0/ /home/user/ma_cle

/!\ le répertoire "ma_cle" est créé à la volée

Supprimer un lien

$ unlink nom_du_lien

Paramétrer un programme par défaut

Il existe plusieurs manières de paramétrer un programme pour qu'il prenne le pas sur un autre mais la solution commune à la plupart des distributions consiste à créer un lien symbolique vers le programme souhaité.

Commencer par repérer le nom exacte du programme

$ ls -al /usr/bin/

Les liens symboliques existants pointant vers les programmes par défaut du système sont stockés dans le répertoire /etc/alternatives/

$ cd /etc/alternatives/
$ ls -al 

Il sera nécessaire de supprimer le lien s'il existe déjà, par exemple pour remplacer Google chrome par Opera comme navigateur par défaut la méthode est la suivante:

Supprimer le lien existant

# rm x-www-browser

ou

# unlink x-www-browser

Créer le nouveau lien

# ln -s /usr/bin/opera x-www-browser

et vérifier le résultat

$ ls -al | grep browser

Astuces

Vider un fichier

$ echo "" > fichier.txt

ou plus court

$ > fichier.txt
^