Exile on Keyboard St. - Blog sur Linux et Debian

Aller au contenu | Aller au menu | Aller à la recherche

vendredi 16 février 2018

Quelques flags utiles des commandes 'cp' et 'mv'

Que ce soit dans un terminal ou dans un script Shell, on utilise tous quotidiennement les commandes cp et mv.

Mais connaissons tous vraiment les options de ces commandes ? Pas si sûr ... Ces options sont précieuses dans un script Shell pour comprendre le flow d'exécution ou pour débugger celui-ci.

Première option intéressante, l'option -v ou --verbose:

user@machine:~ cp --verbose cleanup.log /tmp/
« cleanup.log » -> « /tmp/cleanup.log »

qui permet d'afficher ce qui est effectué. Cette option existe aussi sur la commande mv.

Deuxième option, l'option --u ou --update permet de ne copier ou déplacer le fichier que si celui-ci est plus récent que la cible:

user@machine:~$ cp --verbose --update cleanup.log /tmp/
user@machine:~$ touch cleanup.log 
user@machine:~$ cp --verbose --update cleanup.log /tmp/
« cleanup.log » -> « /tmp/cleanup.log »

La première commande cp n'a rien fait puisque les fichiers étaient identiques.

cp et mv ont aussi une option qui permet d'archiver les fichiers cibles déjà existant avant de faire la copie ou le déplacement:

user@machine:~$ cp --verbose --backup=numbered cleanup.log /tmp/
« cleanup.log » -> « /tmp/cleanup.log » (archive : « /tmp/cleanup.log.~1~ »)
user@machine:~$ cp --verbose --backup=numbered cleanup.log /tmp/
« cleanup.log » -> « /tmp/cleanup.log » (archive : « /tmp/cleanup.log.~2~ »)

Cela permet de garder les versions précédentes si l'on a besoin de revenir en arrière.

L'option --backup peut prendre les valeurs suivantes:

  • none
  • numbered
  • existing
  • simple

Autre option intéressante pour le mode interactif, l'option --interactive ou -i, qui en cas de fichier existant demande si on doit l'écraser:

user@machine:~$ cp --verbose --interactive cleanup.log /tmp/
cp : voulez-vous écraser « /tmp/cleanup.log » ? oui
« cleanup.log » -> « /tmp/cleanup.log »

Si l'on souhaite conserver les fichiers existants:

user@machine:~$ cp --verbose --no-clobber cleanup.log /tmp/

La copie n'a pas été effectuée.

Enfin pour finir citons le flag -r, -R ou --recursive qui permet de copier récursivement les répertoires.

samedi 13 février 2016

Les options de la commande rm sous Linux

Sous Linux, la suppression de fichiers s'effectue avec la commande rm:

Par exemple:

rm file

SI un des fichiers n'existe pas, la commande rm le signale à l'utilisateur mais continue de supprimer les autres fichiers spécifiés:

rm file-not-found file
rm: impossible de supprimer « file-not-found »: Aucun fichier ou dossier de ce type

Ce mode de fonctionnement est très dangereux parce que si j'entre la commande:

rm to_remove *

et que par inadvertance, j'ai ajouté un espace entre 'to_remove' et '*', j'aurais droit au message suivant:

rm: impossible de supprimer « to_remove »: Aucun fichier ou dossier de ce type

Et la commande rm aura supprimé TOUS les fichiers du répertoire courant puisque le Shell aura interprété l'astérisque en ce sens !

Heureusement pour moi, si dans ce répertoire courant se trouvent aussi des répertoires, le message d'erreur de rm sera:

rm: impossible de supprimer « to_remove »: Aucun fichier ou dossier de ce type
rm: impossible de supprimer « folder1 »: est un dossier
rm: impossible de supprimer « folder2 »: est un dossier
rm: impossible de supprimer « folder3 »: est un dossier

puisque rm ne supprime les répertoires qu'en présence de l'option -r sur la ligne de commande.

Pour éviter de supprimer des fichiers que l'on souhaitait garder, il suffit de passer à la commande rm l'option -i comme suit:

rm -i a z c
rm : supprimer fichier « a » ? yes
rm: impossible de supprimer « z »: Aucun fichier ou dossier de ce type
rm : supprimer fichier « c » ? yes

C'est d’ailleurs une pratique courante (et saine !) de définir l'alias suivant:

alias rm='rm -i'

dans votre fichier .bash_aliases

On peut aussi utiliser -I qui ne demandera qu'une confirmation de suppression lorsqu'il y a plus de 3 fichiers:

touch file1 file2 file3 file4
user@machine:~/tmp$ rm -I file*
rm : supprimer tous les arguments ? 

dimanche 24 août 2014

Protégez vos fichiers importants de la suppression accidentelle sous Linux

Il nous arrive à tous un jour ou l'autre de chercher un fichier sous Linux et de ne plus le retrouver ...

Ainsi récemment j'ai malheureusement supprimé un fichier contenant tout un tas de commandes pratiques dont je ne me souviens pas forcément :-(

Afin de ne pas refaire la même erreur par la suite, j'ai cherché quelle solution mettre en place pour éviter que cela se reproduise.

En ligne de commande, dès lors qu'on a défini un alias sur la commande rm comme suit dans .bashrc ou dans .bash_aliases:

alias rm='rm -i'

On est prévenu lorsqu'on tente de supprimer le fichier:

user@machine:~/Bureau$ rm Important.txt 
rm: remove regular empty file `Important.txt'? 

Et si on ne saisit pas "Yes" celui-ci n'est pas supprimé.

C'est bien mais le gestionnaire de fichiers, Thunar sous Xfce dans mon cas, n'en a que faire de l'alias de la commande rm et le fichier part à la corbeille. Certes, avec la corbeille tout n'est pas encore perdu.

Une solution toute simple consiste à placer tous vos fichiers importants dans un répertoire donné et dans un deuxième temps à enlever les droits d'écriture de ce dernier. En effet, comme sous Linux et sous Unix les droits de suppressions d'un fichier sont ceux du répertoire qui le contient, on ne pourra supprimer aucun fichier du répertoire contenant nos documents importants.

Attention, cette méthode n'empêche pas d'ouvrir le fichier avec un éditeur et donc de supprimer tout ou partie de son contenu (par exemple par Ctrl-A puis Ctrl-X), puisqu'on a les droits de lecture et d'écriture sur le fichier !

Une autre contrepartie de cette solution est que pour créer un nouveau fichier, il faudra temporairement remettre les droits d'écriture sur le répertoire en question. Mais, si on oublie ensuite d'enlever ces droits d'écriture après la création du nouveau fichier on perd évidemment la protection recherchée sur nos fichiers ... On peut par exemple pour éviter ce problème créer plusieurs fichiers vides dès le début et que l'on éditera ensuite.