Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zér0 > Les tutoriels > Officiels > Systèmes alternatifs > Lecture du tutoriel

Manipuler les fichiers

Avatar
Auteur : M@teo21
Créé : le 13/11/2007 18:54:06
Modifié : le 15/11/2007 14:22:10
Noter et commenter ce tutoriel
Imprimer ce tutoriel
Après avoir vu comment étaient organisés les fichiers sous Linux, nous allons apprendre à les manipuler !

Par exemple, comment faire pour afficher le contenu d'un fichier ?
Comment le déplacer, le copier, le supprimer ?

C'est donc un chapitre à la fois simple et riche qui vous attend, durant lequel vous allez apprendre beaucoup de nouvelles commandes basiques de Linux qu'il vous faut connaître absolument ! ;)
Sommaire du chapitre :
Chapitre précédent Sommaire Chapitre suivant

cat & less : afficher un fichier

Nous allons d'abord voir comment afficher le contenu d'un fichier. Il y a en gros 2 commandes basiques sous Linux qui permettent de faire cela :


Aucune de ces commandes ne permet d'éditer un fichier, elles permettent juste de le voir. Nous étudierons l'édition plus tard, ça mérite au moins un autre chapitre entier :p

Mais... pourquoi 2 commandes pour afficher un fichier ? Une seule n'aurait pas suffit ?

En fait, chacune a ses spécificités ! Nous allons les voir dans le détail.

Pour nos exemples, nous allons travailler sur un fichier qui existe déjà : syslog. Il se trouve dans le dossier /var/log. Commencez par vous y rendre :

Code : Console
mateo21@mateo21-desktop:~$ cd /var/log


Ce dossier contient plusieurs fichiers de log, c'est-à-dire des fichiers qui gardent une trace de l'activité de votre ordinateur. Vous pouvez faire la liste si vous voulez, en tapant ls :

Code : Console
mateo21@mateo21-desktop:/var/log$ ls
acpid            daemon.log.0     kern.log.0               scrollkeeper.log.2
acpid.1.gz       daemon.log.1.gz  kern.log.1.gz            syslog
acpid.2.gz       daemon.log.2.gz  kern.log.2.gz            syslog.0
acpid.3.gz       daemon.log.3.gz  kern.log.3.gz            syslog.1.gz
acpid.4.gz       debug            lastlog                  syslog.2.gz
apparmor         debug.0          lpr.log                  syslog.3.gz
apport.log       debug.1.gz       mail.err                 syslog.4.gz
apport.log.1     debug.2.gz       mail.info                syslog.5.gz
apport.log.2.gz  debug.3.gz       mail.log                 syslog.6.gz
apport.log.3.gz  dist-upgrade     mail.warn                udev
apport.log.4.gz  dmesg            messages                 unattended-upgrades
apport.log.5.gz  dmesg.0          messages.0               user.log
apt              dmesg.1.gz       messages.1.gz            user.log.0
auth.log         dmesg.2.gz       messages.2.gz            user.log.1.gz
auth.log.0       dmesg.3.gz       messages.3.gz            user.log.2.gz
auth.log.1.gz    dmesg.4.gz       news                     user.log.3.gz
auth.log.2.gz    dpkg.log         popularity-contest       uucp.log
auth.log.3.gz    dpkg.log.1       popularity-contest.0     wtmp
bittorrent       dpkg.log.2.gz    popularity-contest.1.gz  wtmp.1
boot             faillog          popularity-contest.2.gz  wvdialconf.log
bootstrap.log    fontconfig.log   popularity-contest.3.gz  Xorg.0.log
btmp             fsck             pycentral.log            Xorg.0.log.old
btmp.1           gdm              samba
cups             installer        scrollkeeper.log
daemon.log       kern.log         scrollkeeper.log.1


Le fichier sur lequel nous allons travailler, syslog, contient des informations de log de ce qui s'est passé récemment sur l'ensemble de votre ordinateur.

Vous noterez qu'il est fréquent de voir des fichiers sans extension sous Linux. Notre fichier s'appelle syslog tout court, et non pas syslog.txt ou syslog.log comme on pourrait avoir l'habitude de le voir sous Windows.
Un fichier sans extension peut être ouvert et lu sans aucun problème comme n'importe quel autre fichier.



cat : afficher tout le fichier



La commande cat permet d'afficher tout le contenu d'un fichier dans la console d'un coup.
Il vous suffit d'indiquer en paramètre le nom du fichier que vous voulez afficher, en l'occurence syslog :

Code : Console
mateo21@mateo21-desktop:/var/log$ cat syslog
Nov 14 00:44:23 mateo21-desktop syslogd 1.4.1#21ubuntu3: restart.
Nov 14 00:44:23 mateo21-desktop anacron[6725]: Job `cron.daily' terminated
Nov 14 00:44:23 mateo21-desktop anacron[6725]: Normal exit (1 job run)
Nov 14 00:44:25 mateo21-desktop NetworkManager: <info>  eth1: link timed out. 
Nov 14 00:44:51 mateo21-desktop NetworkManager: <info>  eth1: link timed out. 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <debug> [1194997508.332093] nm_device_802_11_wireless_get_activation_ap(): Forcing AP 'WIFI' 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  User Switch: /org/freedesktop/NetworkManager/Devices/eth1 / WIFI 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Deactivating device eth1. 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Activation (eth1): cancelling... 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Activation (eth1) cancellation handler scheduled... 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Activation (eth1): waiting for device to cancel activation. 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Activation (eth1) cancellation handled. 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Activation (eth1): cancelled. 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  SUP: sending command 'DISABLE_NETWORK 0' 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  SUP: response was 'OK' 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  SUP: sending command 'AP_SCAN 0' 
Nov 14 00:45:16 mateo21-desktop NetworkManager: nm_act_request_get_ap: assertion `req != NULL' failed
Nov 14 00:45:16 mateo21-desktop NetworkManager: nm_act_request_get_stage: assertion `req != NULL' failed
Nov 14 00:45:16 mateo21-desktop NetworkManager: <info>  eth1: link timed out. 
Nov 14 00:45:21 mateo21-desktop NetworkManager: nm_act_request_get_ap: assertion `req != NULL' failed
Nov 14 00:45:21 mateo21-desktop NetworkManager: ap_is_auth_required: assertion `ap != NULL' failed
Nov 14 00:45:21 mateo21-desktop NetworkManager: <info>  Activation (eth1/wireless): association took too long (>120s), asking for new key. 
Nov 14 00:45:21 mateo21-desktop NetworkManager: nm_dbus_get_user_key_for_network: assertion `req != NULL' failed
Nov 14 00:47:45 mateo21-desktop init: tty4 main process (4517) killed by TERM signal
Nov 14 00:47:45 mateo21-desktop init: tty5 main process (4518) killed by TERM signal
Nov 14 00:47:45 mateo21-desktop init: tty2 main process (4520) killed by TERM signal
Nov 14 00:47:45 mateo21-desktop init: tty3 main process (4522) killed by TERM signal
Nov 14 00:47:45 mateo21-desktop init: tty1 main process (4524) killed by TERM signal
Nov 14 00:47:45 mateo21-desktop init: tty6 main process (4525) killed by TERM signal
Nov 14 00:47:46 mateo21-desktop avahi-daemon[5390]: Got SIGTERM, quitting.
Nov 14 00:47:48 mateo21-desktop exiting on signal 15
Nov 14 00:48:42 mateo21-desktop syslogd 1.4.1#21ubuntu3: restart.
Nov 14 00:48:42 mateo21-desktop kernel: Inspecting /boot/System.map-2.6.22-14-generic
Nov 14 00:48:42 mateo21-desktop kernel: Loaded 25445 symbols from /boot/System.map-2.6.22-14-generic.
Nov 14 00:48:42 mateo21-desktop kernel: Symbols match kernel version 2.6.22.
Nov 14 00:48:42 mateo21-desktop kernel: No module symbols loaded - kernel modules not enabled. 
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] Linux version 2.6.22-14-generic (buildd@palmer) (gcc version 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)) #1 SMP Sun Oct 14 23:05:12 GMT 2007 (Ubuntu 2.6.22-14.46-generic)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] BIOS-provided physical RAM map:
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 0000000000000000 - 000000000009f800 (usable)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 0000000000100000 - 000000007f680000 (usable)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 000000007f680000 - 000000007f68e000 (ACPI data)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 000000007f68e000 - 000000007f700000 (ACPI NVS)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 000000007f700000 - 0000000080000000 (reserved)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 00000000fec00000 - 00000000fec10000 (reserved)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 00000000fed00000 - 00000000fed00400 (reserved)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 00000000fed14000 - 00000000fed1a000 (reserved)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 00000000fed1c000 - 00000000fed90000 (reserved)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 00000000ff000000 - 0000000100000000 (reserved)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] 1142MB HIGHMEM available.
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] 896MB LOWMEM available.
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] found SMP MP-table at 000f7700
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] Entering add_active_range(0, 0, 521856) 0 entries of 256 used
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] Zone PFN ranges:
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]   DMA             0 ->     4096
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]   Normal       4096 ->   229376
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]   HighMem    229376 ->   521856
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] early_node_map[1] active PFN ranges
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]     0:        0 ->   521856
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] On node 0 totalpages: 521856
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]   DMA zone: 32 pages used for memmap
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]   DMA zone: 0 pages reserved
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]   DMA zone: 4064 pages, LIFO batch:0
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]   Normal zone: 1760 pages used for memmap
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]   Normal zone: 223520 pages, LIFO batch:31
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]   HighMem zone: 2285 pages used for memmap
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]   HighMem zone: 290195 pages, LIFO batch:31
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] DMI present.
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: RSDP signature @ 0xC00F7650 checksum 0
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: RSDP 000F7650, 0014 (r0 PTLTD )
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: RSDT 7F6889F5, 004C (r1 MSTEST TESTONLY  6040000  LTP        0)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: FACP 7F68DCAA, 0074 (r1 INTEL  CALISTGA  6040000 LOHR       5A)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: DSDT 7F68A0EC, 3BBE (r1 INTEL  CALISTGA  6040000 INTL 20050624)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: FACS 7F68EFC0, 0040
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: APIC 7F68DD1E, 0068 (r1 INTEL  CALISTGA  6040000 LOHR       5A)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: HPET 7F68DD86, 0038 (r1 INTEL  CALISTGA  6040000 LOHR       5A)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: MCFG 7F68DDBE, 003C (r1 INTEL  CALISTGA  6040000 LOHR       5A)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: SLIC 7F68DDFA, 0176 (r1 MSTEST TESTONLY  6040000  LTP        0)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: APIC 7F68DF70, 0068 (r1 PTLTD  ^I APIC    6040000  LTP        0)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: BOOT 7F68DFD8, 0028 (r1 PTLTD  $SBFTBL$  6040000  LTP        1)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: SSDT 7F689A9D, 064F (r1 SataRe  SataPri     1000 INTL 20050624)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: SSDT 7F68940B, 0692 (r1 SataRe  SataSec     1000 INTL 20050624)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: SSDT 7F688A41, 04F6 (r1  PmRef    CpuPm     3000 INTL 20050624)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: BIOS bug: multiple APIC/MADT found, using 0
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: If "acpi_apic_instance=2" works better, notify linux-acpi@vger.kernel.org
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: PM-Timer IO Port: 0x1008
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: Local APIC address 0xfee00000
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] Processor #0 6:15 APIC version 20
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x01] enabled)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] Processor #1 6:15 APIC version 20
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: IOAPIC (id[0x01] address[0xfec00000] gsi_base[0])
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] IOAPIC[0]: apic_id 1, version 32, address 0xfec00000, GSI 0-23
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
 
...


Comme le fichier est très gros (il fait plusieurs centaines de lignes), je n'ai d'ailleurs pas copié tout ce qui s'est affiché dans ma console :p
Ne vous étonnez pas si vous voyez tout s'afficher d'un coup : c'est normal, c'est le but. La commande cat vous envoie tout le fichier à la figure. Elle est plus adaptée lorsqu'on travaille sur des petits fichiers que sur des gros, car dans un cas comme celui-là on n'a pas le temps de lire tout ce qui s'affiche à l'écran ;)

Il y a peu de paramètres vraiment intéressants à utiliser avec la commande cat, car c'est une commande somme toute très basique. On notera quand même le paramètre -n qui permet d'afficher les numéros de ligne :

Code : Console
mateo21@mateo21-desktop:/var/log$ cat -n syslog
     1        Nov 14 00:44:23 mateo21-desktop syslogd 1.4.1#21ubuntu3: restart.
     2        Nov 14 00:44:23 mateo21-desktop anacron[6725]: Job `cron.daily' terminated
     3        Nov 14 00:44:23 mateo21-desktop anacron[6725]: Normal exit (1 job run)
     4        Nov 14 00:44:25 mateo21-desktop NetworkManager: <info>  eth1: link timed out. 
     5        Nov 14 00:44:51 mateo21-desktop NetworkManager: <info>  eth1: link timed out. 
     6        Nov 14 00:45:08 mateo21-desktop NetworkManager: <debug> [1194997508.332093] nm_device_802_11_wireless_get_activation_ap(): Forcing AP 'WIFI' 
     7        Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  User Switch: /org/freedesktop/NetworkManager/Devices/eth1 / WIFI 
     8        Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Deactivating device eth1. 
     9        Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Activation (eth1): cancelling... 
    10        Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Activation (eth1) cancellation handler scheduled... 
    11        Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Activation (eth1): waiting for device to cancel activation. 
    12        Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Activation (eth1) cancellation handled. 
    13        Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Activation (eth1): cancelled. 
    14        Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  SUP: sending command 'DISABLE_NETWORK 0' 
    15        Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  SUP: response was 'OK' 
    16        Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  SUP: sending command 'AP_SCAN 0' 
    17        Nov 14 00:45:16 mateo21-desktop NetworkManager: nm_act_request_get_ap: assertion `req != NULL' failed
    18        Nov 14 00:45:16 mateo21-desktop NetworkManager: nm_act_request_get_stage: assertion `req != NULL' failed
    19        Nov 14 00:45:16 mateo21-desktop NetworkManager: <info>  eth1: link timed out. 
    20        Nov 14 00:45:21 mateo21-desktop NetworkManager: nm_act_request_get_ap: assertion `req != NULL' failed
    21        Nov 14 00:45:21 mateo21-desktop NetworkManager: ap_is_auth_required: assertion `ap != NULL' failed
 
...


less : afficher le fichier page par page



La commande cat est rapide. Trop rapide. Tout le fichier est lu et affiché d'un coup dans la console, ce qui fait qu'on n'a pas le temps de le lire s'il est très gros.

C'est là qu'une autre commande comme less devient vraiment indispensable. La grosse différence entre less et cat, c'est que less affiche progressivement le contenu du fichier, page par page. Ca vous laisse le temps de le lire dans la console :)

Notez qu'il existe aussi une commande très proche : more. Pour faire simple, la différence entre more et less c'est que more est vieux et possède peu de fonctionnalités, tandis que less est beaucoup plus puissant et rapide. Bref, utilisez less, mais si vous voyez quelqu'un utiliser more un jour ne soyez pas surpris ;)
D'ailleurs, j'avoue qu'il m'arrive encore d'utiliser more aujourd'hui, mais j'essaie de perdre cette mauvaise habitude, il n'y a vraiment que des avantages à utiliser less :p


Comment ça marche ? Eh bien la commande est très simple : less nomdufichier.

Code : Console
mateo21@mateo21-desktop:/var/log$ less syslog
Nov 14 00:44:23 mateo21-desktop syslogd 1.4.1#21ubuntu3: restart.
Nov 14 00:44:23 mateo21-desktop anacron[6725]: Job `cron.daily' terminated
Nov 14 00:44:23 mateo21-desktop anacron[6725]: Normal exit (1 job run)
Nov 14 00:44:25 mateo21-desktop NetworkManager: <info>  eth1: link timed out. 
Nov 14 00:44:51 mateo21-desktop NetworkManager: <info>  eth1: link timed out. 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <debug> [1194997508.332093] nm_device_802_11_wireless_get_activation_ap(): Forcing AP 'WIFI' 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  User Switch: /org/freedesktop/NetworkManager/Devices/eth1 / WIFI 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Deactivating device eth1. 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Activation (eth1): cancelling... 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Activation (eth1) cancellation handler scheduled... 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Activation (eth1): waiting for device to cancel activation. 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Activation (eth1) cancellation handled. 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Activation (eth1): cancelled. 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  SUP: sending command 'DISABLE_NETWORK 0' 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  SUP: response was 'OK' 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  SUP: sending command 'AP_SCAN 0' 
Nov 14 00:45:16 mateo21-desktop NetworkManager: nm_act_request_get_ap: assertion `req != NULL' failed
Nov 14 00:45:16 mateo21-desktop NetworkManager: nm_act_request_get_stage: assertion `req != NULL' failed
Nov 14 00:45:16 mateo21-desktop NetworkManager: <info>  eth1: link timed out. 
Nov 14 00:45:21 mateo21-desktop NetworkManager: nm_act_request_get_ap: assertion `req != NULL' failed
Nov 14 00:45:21 mateo21-desktop NetworkManager: ap_is_auth_required: assertion `ap != NULL' failed
Nov 14 00:45:21 mateo21-desktop NetworkManager: <info>  Activation (eth1/wireless): association took too long (>120s), asking for new key. 
Nov 14 00:45:21 mateo21-desktop NetworkManager: nm_dbus_get_user_key_for_network: assertion `req != NULL' failed
syslog


Ce qui est intéressant pour nous ici, c'est que la commande less a arrêté la lecture du fichier au bout de quelques lignes (la taille d'un écran de console). Cela vous laisse le temps de lire le début du fichier.

On n'a lu pour le moment que les toutes premières lignes du fichier.

Et comment lire la suite ?


Il y a quelques raccourcis clavier à connaître ;)


Les raccourcis basiques indispensables



Commençons par les quelques raccourcis clavier les plus indispensables, à connaître absolument :

ToucheEffet
Espace
Affiche la suite du fichier. La touche Espace fait défiler le fichier vers le bas d'un "écran" de console. C'est celle que j'utilise le plus souvent.
Vous pouvez aussi utiliser la touche "Page Down".
Entrée
Affiche la ligne suivante. Cela permet donc de faire défiler le fichier vers le bas ligne par ligne.
Vous pouvez aussi utiliser la touche "Flèche vers le bas"
d
Affiche les 11 lignes suivantes (soit une moitié d'écran). C'est un peu l'intermédiaire entre Espace (tout un écran) et Entrée (une seule ligne).
b
Retourne en arrière d'un écran.
Vous pouvez aussi appuyer sur la touche "Page Up".
y
Retourne d'une ligne en arrière.
Vous pouvez aussi appuyer sur la touche "Flèche vers le haut".
u
Retourne en arrière d'une moitié d'écran (11 lignes).
q
Arrête la lecture du fichier. Cela met fin à la commande less.


La casse des caractères est importante. Ainsi, si je vous dis qu'il faut appuyer sur la touche "d", ce n'est pas un "D" majuscule (si vous essayez "D" majuscule vous verrez que ça ne marche pas). Sous Linux on fait souvent la différence entre les majuscules et minuscules, souvenez-vous en !


Si on tape Espace, on avance donc d'un écran dans le fichier :

Code : Console
Nov 14 00:47:45 mateo21-desktop init: tty4 main process (4517) killed by TERM signal
Nov 14 00:47:45 mateo21-desktop init: tty5 main process (4518) killed by TERM signal
Nov 14 00:47:45 mateo21-desktop init: tty2 main process (4520) killed by TERM signal
Nov 14 00:47:45 mateo21-desktop init: tty3 main process (4522) killed by TERM signal
Nov 14 00:47:45 mateo21-desktop init: tty1 main process (4524) killed by TERM signal
Nov 14 00:47:45 mateo21-desktop init: tty6 main process (4525) killed by TERM signal
Nov 14 00:47:46 mateo21-desktop avahi-daemon[5390]: Got SIGTERM, quitting.
Nov 14 00:47:48 mateo21-desktop exiting on signal 15
Nov 14 00:48:42 mateo21-desktop syslogd 1.4.1#21ubuntu3: restart.
Nov 14 00:48:42 mateo21-desktop kernel: Inspecting /boot/System.map-2.6.22-14-generic
Nov 14 00:48:42 mateo21-desktop kernel: Loaded 25445 symbols from /boot/System.map-2.6.22-14-generic.
Nov 14 00:48:42 mateo21-desktop kernel: Symbols match kernel version 2.6.22.
Nov 14 00:48:42 mateo21-desktop kernel: No module symbols loaded - kernel modules not enabled. 
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] Linux version 2.6.22-14-generic (buildd@palmer) (gcc version 4.1.3 20070929 (prerelease) (Ubu
ntu 4.1.2-16ubuntu2)) #1 SMP Sun Oct 14 23:05:12 GMT 2007 (Ubuntu 2.6.22-14.46-generic)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000] BIOS-provided physical RAM map:
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 0000000000000000 - 000000000009f800 (usable)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 0000000000100000 - 000000007f680000 (usable)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 000000007f680000 - 000000007f68e000 (ACPI data)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 000000007f68e000 - 000000007f700000 (ACPI NVS)
Nov 14 00:48:42 mateo21-desktop kernel: [    0.000000]  BIOS-e820: 000000007f700000 - 0000000080000000 (reserved)
:



Quelques raccourcis plus avancés



Ce ne sont pas des raccourcis que l'on utilise tous les jours, mais ça vaut le coup de savoir qu'ils existent :)

ToucheEffet
=
Indique où vous en êtes dans le fichier (numéro des lignes affichées et pourcentage).
h
Affiche l'aide (toutes les commandes que je vous apprends ici, je les tire de là :p ). Tapez "q" pour sortir de l'aide.
/
Tapez "/" suivi du texte que vous recherchez pour lancer le mode recherche. Faites Entrée pour valider. Pour ceux qui savent s'en servir, sachez que les expressions régulières sont acceptées (je ne vais pas vous faire un cours sur les expressions régulières ici, ce serait trop long, mais il y en a un dans le cours PHP).
n
Après avoir fait une recherche avec "/", la touche "n" vous permet d'aller à la prochaine occurence de votre recherche. C'est un peu comme si vous cliquiez sur le bouton "Résultat suivant" ;)
N
Pareil que "n", mais pour revenir en arrière.


Comme vous le voyez, la commande less est très riche. On peut utiliser beaucoup de touches différentes pour se déplacer dans le fichier.
Prenez le temps de vous familiariser avec : c'est un peu perturbant au début, mais lorsque vous aurez appris à vous en servir vous aurez déjà fait un grand pas en avant... et puis ça vous sera très pratique plus tard, croyez-moi ;)

head & tail : afficher le début et la fin d'un fichier

Quoiii ? Encore des commandes pour lire un fichier ? o_O


Eh oui :D
Et figurez-vous que celles-là aussi ça vaut le coup de les connaître. Comme quoi on en fait des commandes rien que pour lire un fichier !

Ces deux commandes sont un peu le contraire l'une de l'autre : la première permet d'afficher le début du fichier, la seconde permet d'afficher la fin.


head : afficher le début du fichier



La commande head ("tête" en anglais) affiche seulement les premières lignes du fichier. Elle ne permet pas de se déplacer dans le fichier comme less, elle permet juste de récupérer les premières lignes.

Code : Console
mateo21@mateo21-desktop:/var/log$ head syslog
Nov 14 00:44:23 mateo21-desktop syslogd 1.4.1#21ubuntu3: restart.
Nov 14 00:44:23 mateo21-desktop anacron[6725]: Job `cron.daily' terminated
Nov 14 00:44:23 mateo21-desktop anacron[6725]: Normal exit (1 job run)
Nov 14 00:44:25 mateo21-desktop NetworkManager: <info>  eth1: link timed out. 
Nov 14 00:44:51 mateo21-desktop NetworkManager: <info>  eth1: link timed out. 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <debug> [1194997508.332093] nm_device_802_11_wireless_get_activation_ap(): Forcing AP 'WIFI' 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  User Switch: /org/freedesktop/NetworkManager/Devices/eth1 / WIFI 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Deactivating device eth1. 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Activation (eth1): cancelling... 
Nov 14 00:45:08 mateo21-desktop NetworkManager: <info>  Activation (eth1) cancellation handler scheduled...

Si vous avez juste besoin de récupérer les premières lignes d'un fichier, head est donc la commande qu'il vous faut. Simple, net, efficace :)

Comment ? Vous voulez des paramètres ?
Je n'en ai pas beaucoup à vous offrir, mais celui-là au moins est à connaître : -n, suivi d'un nombre. Il permet d'afficher le nombre de lignes que vous voulez. Par exemple, si vous ne voulez que les 3 premières lignes, tapez :

Code : Console
mateo21@mateo21-desktop:/var/log$ head -n 3 syslog
Nov 14 00:44:23 mateo21-desktop syslogd 1.4.1#21ubuntu3: restart.
Nov 14 00:44:23 mateo21-desktop anacron[6725]: Job `cron.daily' terminated
Nov 14 00:44:23 mateo21-desktop anacron[6725]: Normal exit (1 job run)


Et voilà le travail ! :)


tail : afficher la fin du fichier



Très intéressante aussi (voire même plus), la commande tail vous renvoie la fin du fichier, donc les dernières lignes.

Code : Console
mateo21@mateo21-desktop:/var/log$ tail syslog
Nov 14 22:42:10 mateo21-desktop NetworkManager: <info>  Clearing nscd hosts cache. 
Nov 14 22:42:10 mateo21-desktop NetworkManager: <WARN>  nm_spawn_process(): nm_spawn_process('/usr/sbin/nscd -i hosts'): could not spawn process. (Failed to execute child process "/usr/sbin/nscd" (No such file or directory))  
Nov 14 22:42:10 mateo21-desktop NetworkManager: <info>  Activation (eth1) Finish handler scheduled. 
Nov 14 22:42:10 mateo21-desktop NetworkManager: <info>  Activation (eth1) Stage 5 of 5 (IP Configure Commit) complete. 
Nov 14 22:42:10 mateo21-desktop NetworkManager: <info>  Activation (eth1) successful, device activated. 
Nov 14 22:41:57 mateo21-desktop ntpdate[8422]: step time server 91.189.94.4 offset -13.401451 sec
Nov 14 22:41:59 mateo21-desktop avahi-daemon[5385]: Registering new address record for fe80::219:d2ff:fe61:900a on eth1.*.
Nov 14 22:42:08 mateo21-desktop kernel: [ 7870.160000] eth1: no IPv6 routers present
Nov 14 23:11:26 mateo21-desktop -- MARK --
Nov 14 23:17:01 mateo21-desktop /USR/SBIN/CRON[8515]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)


On peut là encore utiliser -n suivi d'un nombre pour afficher les X dernières lignes :

Code : Console
mateo21@mateo21-desktop:/var/log$ tail -n 3 syslog
Nov 14 22:42:08 mateo21-desktop kernel: [ 7870.160000] eth1: no IPv6 routers present
Nov 14 23:11:26 mateo21-desktop -- MARK --
Nov 14 23:17:01 mateo21-desktop /USR/SBIN/CRON[8515]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)


Mais ce n'est pas tout ! Il y a un autre paramètre à côté duquel vous ne pouvez pas passer : -f (f pour "follow", "suivre" en anglais).

Ce paramètre magique ordonne à tail de "suivre" la fin du fichier au fur et à mesure de son évolution.
C'est extrêmement utile pour suivre un fichier de log qui évolue souvent. Vous pouvez tester sur syslog par exemple :

Code : Console
mateo21@mateo21-desktop:/var/log$ tail -f syslog
Nov 14 23:11:26 mateo21-desktop -- MARK --
Nov 14 23:17:01 mateo21-desktop /USR/SBIN/CRON[8515]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
Nov 14 23:27:52 mateo21-desktop kernel: [10614.344000] ata2.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x2 frozen
Nov 14 23:27:52 mateo21-desktop kernel: [10614.344000] ata2.00: cmd a0/00:00:00:00:20/00:00:00:00:00/a0 tag 0 cdb 0x0 data 0 
Nov 14 23:27:52 mateo21-desktop kernel: [10614.344000]          res 40/00:03:00:00:00/00:00:00:00:00/a0 Emask 0x4 (timeout)
Nov 14 23:27:57 mateo21-desktop kernel: [10619.388000] ata2: port is slow to respond, please be patient (Status 0xd0)
Nov 14 23:28:02 mateo21-desktop kernel: [10624.392000] ata2: device not ready (errno=-16), forcing hardreset
Nov 14 23:28:02 mateo21-desktop kernel: [10624.392000] ata2: soft resetting port
Nov 14 23:28:02 mateo21-desktop kernel: [10624.928000] ata2.00: configured for UDMA/33
Nov 14 23:28:02 mateo21-desktop kernel: [10624.928000] ata2: EH complete


Le problème de syslog c'est qu'il n'évolue pas forcément toutes les secondes. Mais si vous êtes patient et que vous regardez votre console, vous devriez le voir écrire de nouvelles lignes sous vos yeux au bout d'un moment ;)

Faites Ctrl + C (Ctrl et C en même temps) pour arrêter la commande tail.

A connaître : la combinaison de touche Ctrl + C est utilisable dans la plupart des programmes console pour demander leur arrêt. C'est un peu l'équivalent du Alt + F4 de Windows.


Pour tout vous dire, tail -f est une de mes commandes préférées sous Linux. En effet, elle a un petit côté Matrix qui impressionne pas mal les gens, surtout si vous le faites sur un fichier de log qui évolue très vite. Et à part pour impressionner les gens, c'est aussi un bon moyen pour vous de surveiller ce qui se passe en temps réel sur un ordinateur (si vous êtes assez rapide pour suivre :p )

Par exemple, les logs Apache du Site du Zéro permettent de voir en temps réel qui se connecte sur le site, avec quelle IP, quel fichier a été chargé, à quelle heure etc.
Aux heures d'affluence du site, ce fichier évolue tellement vite qu'il est pratiquement impossible de le suivre pour un humain :p
Je vous ai fait une petite vidéo pour que vous vous rendiez compte de la chose :



Notez que par défaut, tail -f recherche les nouveaux changements dans le fichier toutes les secondes. Si vous voulez, vous pouvez rajouter le paramètre -s suivi d'un nombre. Par exemple, tail -f -s 3 syslog recherchera les changements toutes les 3 secondes (au lieu de toutes les secondes). Les nombres décimaux sont acceptés, à condition d'utiliser le point "." à la place de la virgule.

touch & mkdir : créer des fichiers et dossiers

Assez lu de fichiers, maintenant voyons voir comment on les crée ! :)

Nous allons d'abord voir comment créer un fichier, puis comment créer un dossier, car ce n'est pas la même commande...


touch : créer un nouveau fichier



En fait, il n'existe aucune commande spécialement faite pour créer un nouveau fichier vide sous Linux (ce n'est pas très utile). En général, on se contente d'ouvrir un éditeur de texte et d'enregistrer, ce qui provoque la création d'un nouveau fichier comme sous Windows.

La commande touch est à la base faite pour modifier la date de dernière modification d'un fichier. D'où son nom : on "touche" le fichier pour faire croire à l'ordinateur qu'on vient de le modifier alors qu'on n'a rien changé. Ca peut se révéler utile dans certains cas précis qu'on ne verra pas ici.

L'intérêt de touch pour nous dans ce chapitre, c'est que si le fichier n'existe pas, il sera créé ! On peut donc aussi utiliser touch pour créer de nouveaux fichiers, même s'il n'a pas vraiment été fait pour ça à la base :p


La commande attend un paramètre : le nom du fichier à créer.
Commencez par vous rendre dans votre dossier personnel, ce n'est pas une bonne idée de mettre le bazar dans /var/log, le dossier personnel est là pour ça ;)
Si vous vous souvenez bien, il suffit de taper cd :

Code : Console
mateo21@mateo21-desktop:/var/log$ cd
mateo21@mateo21-desktop:~$


Pour le moment, mon dossier personnel ne contient que des sous-dossiers :

Code : Console
mateo21@mateo21-desktop:~$ ls -F
Desktop/    Examples@  Images/  Modèles/  Public/  Vidéos/
Documents/  images/    log/     Musique/  tutos/


Créons un fichier appelé "fichierbidon" :

Code : Console
mateo21@mateo21-desktop:~$ touch fichierbidon
mateo21@mateo21-desktop:~$ ls -F
Desktop/    Examples@     images/  log/      Musique/  tutos/
Documents/  fichierbidon  Images/  Modèles/  Public/   Vidéos/


Comme le montre la commande ls -F que j'ai tapée ensuite, un fichier appelé "fichierbidon" (sans extension) a été créé. Bien entendu, vous pouvez créer un fichier de l'extension que vous voulez :

Code : Console
mateo21@mateo21-desktop:~$ touch autrefichierbidon.txt
mateo21@mateo21-desktop:~$ ls -F
autrefichierbidon.txt  Examples@     Images/   Musique/  Vidéos/
Desktop/               fichierbidon  log/      Public/
Documents/             images/       Modèles/  tutos/


Autre information intéressante : vous pouvez créer plusieurs fichiers en une seule commande. Il vous suffit de les lister l'un après l'autre, séparés par des espaces.
Ainsi, on aurait pu créer nos 2 fichiers comme ceci :

Code : Console
touch fichierbidon autrefichierbidon.txt


Et si je veux que mon fichier contienne un espace, je fais comment ?


Entourez-le de guillemets !

Code : Console
touch "Fichier bidon"


mkdir : créer un nouveau dossier



La commande mkdir, elle, est faite pour créer un nouveau dossier. Elle fonctionne de la même manière que touch.

Code : Console
mkdir mondossier


On peut créer 2 dossiers (ou plus !) en même temps en les séparant là aussi par des espaces :

Code : Console
mkdir mondossier autredossier


Si vous faites un ls, vous verrez que les dossiers ont bien été créés :)

Il y a un paramètre utile avec mkdir : -p. Il sert à créer tous les dossiers intermédiaires. Par exemple :

Code : Console
mkdir -p animaux/vertebres/chat


... créera le dossier animaux, puis à l'intérieur le sous-dossier vertebres, puis à l'intérieur encore le sous-dossier chat !

cp & mv : copier et déplacer un fichier

Parmi les opérations de base que l'on veut pouvoir faire avec les fichiers, il y a la copie et le déplacement de fichier. C'est un peu le genre de truc que l'on fait tous les jours, donc il est important de savoir s'en servir ;)


cp : copier un fichier



La commande cp (abréviation de "CoPy", "copier" en anglais) vous permet comme son nom l'indique de copier un fichier... mais aussi de copier plusieurs fichiers à la fois, et même de copier des dossiers !

Si on essayait de copier le fichier fichierbidon qu'on a créé tout à l'heure ?
Ca fonctionne comme ceci :

Code : Console
cp fichierbidon fichiercopie


Le premier paramètre est le nom du fichier à copier, le second est le nom de la copie du fichier à créer.
En faisant cela, on aura donc 2 fichiers identiques dans le même répertoire : fichierbidon et fichiercopie.

N'oubliez pas d'utiliser l'autocomplétion avec la touche Tab ! Lorsque vous avez écrit "cp fic", tapez Tab, et fichierbidon devrait se compléter tout seul !


Copier dans un autre dossier



On n'est pas obligé de copier le fichier dans le même dossier bien sûr. On peut très bien utiliser le système de répertoires relatifs et absolus qu'on a vu dans le chapitre précédent.
Par exemple, si je veux copier fichierbidon dans le sous-dossier "mondossier" que j'ai créé tout à l'heure :

Code : Console
cp fichierbidon mondossier/


Le fichier fichierbidon sera copié dans mondossier sous le même nom.

Notez que mettre le / à la fin n'est pas obligatoire. Si vous le voyez là, c'est parce que l'autocomplétion me l'a automatiquement ajouté lorsque j'ai appuyé sur Tab. Ehhh oui, je suis tellement flemmard que je n'écris même pas "mondossier" en entier, j'écris juste "mon" suivi de Tab, et hop là c'est écrit en entier ! Ca va beaucoup plus vite lorsqu'on prend ce réflexe :)


Si vous voulez copier fichierbidon dans mondossier sous un autre nom, faites comme ceci :

Code : Console
cp fichierbidon mondossier/fichiercopie


... avec cette commande, on aura créé une copie de fichierbidon dans "mondossier" sous le nom "fichiercopie" !

Enfin, là j'utilise des répertoires relatifs, mais je peux aussi écrire un répertoire en absolu :

Code : Console
cp fichierbidon /var/log/


... copiera fichierbidon dans le dossier /var/log.


Copier des dossiers



Avec l'option -R (un R majuscule !), vous pouvez copier un dossier, ainsi que tous les sous-dossiers et fichiers qu'il contient !

Tout à l'heure, on a créé un dossier "animaux" qui contenait un autre dossier "vertebres", qui lui-même contenait le dossier "chat". Si vous tapez cette commande :

Code : Console
cp -R animaux autresanimaux


... cela aura pour effet de copier animaux et tous ses sous-dossiers sous le nom "autresanimaux".
Faites des ls après pour vérifier que les sous-dossiers sont bien là et que je ne vous mène pas en bateau ! ;)


Utiliser le joker *



Le symbole * est appelé joker, ou encore wildcard en anglais sous linux.
Il vous permet de copier par exemple tous les fichiers image .jpg dans un sous-dossier :

Code : Console
cp *.jpg mondossier/


Vous pouvez aussi vous en servir pour copier tous les fichiers dont le nom commence par "so" :

Code : Console
cp so* mondossier/


Le joker est un atout très puissant, n'hésitez pas à l'utiliser !
C'est avec des outils comme le joker que la console devient pour vous progressivement plus puissante que l'explorateur de fichiers que vous manipulez à la souris.


mv : déplacer un fichier



Très proche de cp, la commande mv (MoVe, "déplacer" en anglais) a en fait 2 utilités :


Vous allez comprendre pourquoi :p

Déplacer un fichier



La commande mv s'utilise pratiquement comme cp :

Code : Console
mv fichierbidon mondossier/


Au lieu de copier fichierbidon dans mondossier comme on l'a fait tout à l'heure, ici on a juste déplacé le fichier. Il n'existe plus dans son dossier d'origine.

Vous pouvez déplacer des dossiers aussi simplement :

Code : Console
mv animaux/ mondossier/


... déplacera le dossier animaux (et tous ses sous-dossiers) dans mondossier.

Vous pouvez aussi utiliser les jokers :

Code : Console
mv *.jpg mondossier/



Renommer un fichier



La commande mv permet de faire quelque chose d'assez étonnant : renommer un fichier. En effet, il n'existe pas de commande spéciale pour renommer un fichier en console sous linux, c'est la commande mv qui est utilisée pour ça.

Par exemple :

Code : Console
mv fichierbidon superfichier


... renommera "fichierbidon" en "superfichier". Après cette commande, fichierbidon n'existe plus, il a été renommé.


Déplacer et renommer un fichier à la fois



Vous pouvez aussi déplacer fichierbidon dans "mondossier" tout en lui affectant un nouveau nom :

Code : Console
mv fichierbidon mondossier/superfichier


Et voilà le travail !


Je vous conseille fortement de vous entraîner à utiliser cp et mv dans tous les sens : avec ou sans joker, en déplaçant, renommant des dossiers, en déplaçant/renommant à la fois, en utilisant des chemins relatifs et absolus, etc etc.
C'est assez intuitif normalement, mais il faut pratiquer et pas juste se contenter de lire ce que j'écris pour que ça rentre.

N'oubliez pas d'utiliser l'autocomplétion de fichiers et dossiers avec la touche Tab, si vous ne le faites pas dès maintenant vous perdrez du temps et vous trouverez la console nulle alors que vous devriez la trouver géniale :p
Autre chose : le symbole ".." signifie "dossier précédent", et "." signifie "dossier dans lequel je me trouve". Vous pourriez en avoir besoin lorsque vous copiez ou déplacez un fichier.


Si vous avez la tête qui tourne à force de copier et déplacer des fichiers dans des dossiers, c'est normal. Ca commence à devenir un beau bordel dans vos dossiers d'ailleurs, non ? :-°
Il est temps de faire un peu de ménage avec la commande permettant de SUPPRIMER : rm ! :pirate:

rm : supprimer des fichiers et dossiers

On attaque la commande qui fâche : rm.
Pourquoi est-ce qu'elle fâche ? Parce qu'il n'existe pas de corbeille dans la console de linux : le fichier est directement supprimé sans possibilité de récupération !


rm : supprimer un fichier



La commande rm (pour "ReMove", "supprimer" en anglais) peut supprimer un fichier, 2 fichiers, plusieurs fichiers, des dossiers, voire même votre ordinateur entier si vous le voulez :-°

Il faut l'utiliser avec précaution donc. Commençons par des choses simples, supprimons ce fichierbidon :

Code : Console
rm fichierbidon


Normalement, on ne vous demande pas de confirmation, on ne vous affiche rien. Le fichier est supprimé sans autre forme d'avertissement. Brutal, hein ? :pirate:

Vous pouvez aussi supprimer plusieurs fichiers en séparant leurs noms par des espaces :

Code : Console
rm fichierbidon fichiercopie


-i : demander confirmation



La commande -i permet de vous demander une confirmation pour chacun des fichiers :

Code : Console
mateo21@mateo21-desktop:~$ rm -i fichierbidon 
rm: détruire fichier régulier vide `fichierbidon'?


Lorsqu'on vous demande une confirmation de type oui/non comme ici, vous devez répondre par une lettre :


Tapez ensuite sur Entrée pour valider.

-f : forcer la suppression, quoiqu'il arrive



-f, c'est un peu le contraire de -i : c'est le mode des gros bourrins :p
Ce paramètre force la suppression, ne demande pas confirmation, même s'il y a un problème potentiel.

En raison des risques que cela comporte, utilisez-le aussi rarement que possible.

Code : Console
rm -f fichierbidon


-v : dis-moi ce que tu fais, petit cachotier



Le paramètre -v ("Verbose", verbeux en anglais, c'est-à-dire "parler beaucoup") est un paramètre que l'on retrouve dans beaucoup beaucoup de commandes sous Linux. Il permet de demander à la commande de dire ce qu'elle est en train de faire.

Comme vous l'avez vu, par défaut la commande rm est silencieuse. Si vous supprimez de très nombreux fichiers, ça peut prendre du temps. Pour éviter que vous vous impatientiez, pensez à utiliser -v :

Code : Console
mateo21@mateo21-desktop:~$ rm -v fichierbidon fichiercopie 
détruit `fichierbidon'
détruit `fichiercopie'


Vous voyez au fur et à mesure de l'avancement ce qui est en train d'être fait. Très pratique !


-r : supprimer un dossier et son contenu



Le paramètre -r peut être utilisé pour supprimer un dossier (au lieu d'un fichier) ainsi que tout ce qu'il contient : fichiers et dossiers !

C'est un paramètre assez dangereux, donc faites bien attention de l'utiliser sur un dossier dont vous ne voulez vraiment plus, car tout va disparaître à l'intérieur :

Code : Console
rm -r animaux/


... supprime le dossier "animaux" ainsi que tout ce qu'il contenait (sous-dossiers "vertebres", et "chat").

Notez qu'il existe aussi la commande rmdir. La grosse différence avec rm -r, c'est que rmdir ne peut supprimer un dossier que s'il est vide ! Il faudra avoir fait le ménage dedans auparavant.


rm et le joker de la Mort (qui tue)



Bon, vous êtes grands, je crois que le moment est venu de vous révéler un terrible secret : les enfants ne naissent pas dans les choux.
Euh pardon, je voulais dire : la commande rm est vraiment dangereuse. Très dangereuse. Vous pouvez potentiellement bousiller tout votre système avec ! :o

Je vais vous montrer quelque chose d'horrible, d'affreux, d'interdit aux moins de 18 ans, bref vous m'avez compris, le truc à ne faire sous aucun prétexte, même pas en cauchemar.


Code : Console
NON NON NON NE FAITES JAMAIS CA !!! => rm -rf /*


Je me suis permis de mettre du texte avant pour vous éviter la tentation de recopier bêtement la commande pour "rigoler", pour "voir ce que ça fait". Je vais vous l'expliquer dans le détail, parce que c'est quand même l'erreur n°1 à ne pas faire sous Linux.



En clair, cette commande supprime tout votre disque dur depuis la racine, sous-dossiers compris, et ne demande aucune confirmation. Aucune possibilité de récupération, votre PC est foutu. Vous êtes bon pour une réinstallation de Linux, et aussi de Windows si la partition de Windows était accessible depuis Linux.

Mais ils sont cons les gens qui ont créé cette commande ! Pourquoi autoriser de faire une chose aussi risquée ? :o


En fait, il y a plusieurs mécanismes de protection. On en apprendra plus dans le prochain chapitre (qui traitera des utilisateurs et de leurs droits).
Par exemple, les fichiers à la racine ne vous "appartiennent" pas, ils appartiennent au super-utilisateur "root". Moi je me suis loggé en tant que mateo21, je n'ai donc théoriquement pas le droit de supprimer ces fichiers. La suppression sera refusée.

Seulement, pour peu que vous soyez loggé en tant que root (on verra comment le faire dans le chapitre suivant), vous aurez le droit de le faire, et là plus rien ne vous arrêtera !

On apprendra plus tard comment utiliser les alias de commande pour éviter qu'une commande aussi dangereuse ne s'exécute. En attendant, ne jouez pas avec le feu, car vous y perdriez les mains, les pieds, la tête et tout ce qui va avec :p


Le joker reste quand même très utile, mais lorsque vous l'utilisez avec rm, triplez d'attention.
Par exemple :

Code : Console
rm -rf *


... supprime tous les fichiers et sous-dossiers du dossier dans lequel je me trouve. Il m'arrive de l'utiliser, d'en avoir besoin, mais à chaque fois je fais très très attention à ce qu'il n'y ait plus rien dans ce dossier (et dans les sous-dossiers) qui m'intéresse.
Comme vous pouvez le voir, il n'y a qu'un seul caractère de différence (le /) avec la commande de la Mort que je vous ai montrée un peu plus haut.

Une erreur est vite arrivée. J'ignore combien de gens se sont pendus après avoir exécuté cette commande, mais ça méritait au moins un GROS avertissement !

Q.C.M.

Laquelle de ces commandes permet de n'afficher que la fin d'un fichier ?
Comment passer à la page suivante avec la commande less ?
Comment savoir à quelle ligne on en est lorsqu'on lit un fichier avec less ?
Comment quitter la commande less ?
Comment quitter une commande tail -f en cours d'exécution ?
Quelle commande permet de renommer un fichier ?
Je veux copier tous les fichiers HTML et toutes les images PNG dans un sous-dossier "backup", et seulement eux. Comment procéder ?
Quel paramètre permet de demander à la commande rm ce qu'elle est en train de faire au fur et à mesure ?


Je vous conseille d'avaler un peu de citrate de Bétaïne pour digérer tout ça :lol:

Non, sans rire, il y avait beaucoup à retenir dans ce chapitre sur la manipulation de fichiers. Le QCM ne peut pas vous questionner sur tout, mais sa taille devrait déjà vous faire comprendre que vous avez vu beaucoup de choses.
Tout ça, ce sont des commandes vraiment basiques que vous utiliserez régulièrement par la suite. Autant vous dire qu'il vaut mieux les digérer correctement.


Prochaine étape : le fonctionnement des utilisateurs, des groupes et de leurs droits sous Linux. On est encore dans le B.A.-BA, mais que voulez-vous, c'est le début. Il fallait bien commencer quelque part, et je vous avais prévenu que le monde de la console était riche et que vous aviez beaucoup à apprendre. Je ne vous ai pas menti vous voyez ;)
Chapitre précédent Sommaire Chapitre suivant
Auteur : M@teo21
Noter et commenter ce tutoriel
Imprimer ce tutoriel

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 138 Zéros connectés | Requêtes SQL 10 requêtes | Temps de génération de la page : Total (SQL) 0.2948s (0.2804s)