Pour savoir quand un OS Linux a été installé :
sudo tune2fs -l /dev/sda1 | grep 'Filesystem created:'
Edit :
Pour compresser :
tar cJf fichier.tar.xz
Pour voir les infos d'un fichier xz :
xz -l fichier.xz
Pour mémoire :
tar xJf fichier.tar.xz
Pour mémoire. Il faut aller voir dans le fichier suivant :
/var/log/apt/history.log
La commande ss
remplace netstat
.
Elle dispose globalement des mêmes options et permet de lancer un fameux :
ss -lapute
Pour plus tard : utiliser un LDAP avec Davical.
Si votre machine tourne sur un OS basé sur Debian, pensez à le mettre à jour !
Note : pour connaître la version d'apt présente sur votre système, utilisez la commande suivante :
# La version d'apt apparaît sur la première ligne de la sortie console
apt-config
La commande shell utile pour additionner une colonne de nombres, grâce à l'outil awk.
Soit le fichier suivant :
cat monfichier
3
183
10
69
Pour additionner ces nombres, j'utilise la commande awk suivante :
cat monfichier | awk '{total = total + $1}END{print total}'
Le résultat affiché est bien entendu 265.
Plutôt que de suivre aveuglément les instructions du site d'AMD afin d'activer ma carte graphique, j'ai fait quelques recherches. Par exemple dans les logs de démarrage :
sudo dmesg | grep -E 'drm|radeon'
Ce qui donne (dans mon cas) :
[ 2.338497] [drm] Initialized
[ 2.390982] [drm] radeon kernel modesetting enabled.
[ 2.416124] [drm:radeon_pci_probe [radeon]] *ERROR* radeon kernel modesetting for R600 or later requires firmware-amd-graphics.
[ 2.429920] [drm] Memory usable by graphics device = 2048M
[ 2.429922] [drm] Replacing VGA console driver
[ 2.442531] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
[ 2.442532] [drm] Driver supports precise vblank timestamp query.
[ 2.478822] [drm] Initialized i915 1.6.0 20160919 for 0000:00:02.0 on minor 0
[ 2.499581] fbcon: inteldrmfb (fb0) is primary device
[ 3.699235] i915 0000:00:02.0: fb0: inteldrmfb frame buffer device
L'erreur mentionnée est assez claire : il faut installer le paquet firmware-amd-graphics. Pour cela, il faut ajouter les dépôts non-free au système :
nano -c /etc/apt/source.list.d/paquets_non_free.list
Dans ce fichier, j'ajoute les deux lignes suivantes (à adapter si besoin) :
deb http://ftp.us.debian.org/debian/ testing main non-free contrib
deb-src http://ftp.us.debian.org/debian/ testing main non-free contrib
Puis je mets à jour la liste des paquets, et j'installe le paquet :
sudo apt update
sudo apt install firmware-amd-graphics
Je redémarre et c'est bon !
Edit :
Pour savoir quelle carte graphique j'ai :
# Mise à jour des ids des cartes graphiques (requiert une connexion à internet)
sudo update-pciids
# Identification
lspci -nn | grep -E 'VGA|Display'
La sortie ressemble à ceci chez moi :
00:02.0 VGA compatible controller [0300]: Intel Corporation 4th Gen Core Processor Integrated Graphics Controller [8086:0416] (rev 06)
01:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Mars XTX [Radeon HD 8790M] [1002:6606]
En effet, la première est intégrée au processeur, la deuxième est une carte graphique séparée.
Edit 2 : /!\ ATTENTiON /!\
Il s'agit en fait d'UNE TRES MAUVAISE IDEE ! Il semble qu'il y ait un problème avec le kernel, qui fait que subitement, au démarrage, il est impossible de se loguer. L'affichage revient sans cesse sur l'écran de login. La seule manière que j'ai trouvé pour résoudre le problème a été de réinstaller (encore) le système entier. Il semble qu'il n'y ait donc aucun moyen (à ma connaissance), d'empécher l'erreur évoquée plus haut d'apparaître.
Il faut au préalable que python et apache soient installés.
Puis il faut se rendre dans le répertoire à partager et taper (avec le terminal) :
# 12345 est le numéro de port sur lequel apache servira la page
python -m SimpleHTTPServer 12345
Puis, d'un autre ordinateur, il suffit de se connecter sur l'URL IP_SRV:12345.
L'astuce du jour : trouver les X fichiers les plus volumineux dans un PATH donné ?
find / -xdev -type f -size +100M -exec du -sh {} ';' | sort -rh | head -n50
Cette commande affiche sur la sortie standard tous les fichiers :
La partition / de mon PC commençait sérieusement à manquer d'espace aujourd'hui (moins de 1.5 Go disponibles). J'ai donc cherché partout la raison de ce remplissage. D'autant que j'ai partitionné mes disques de telle façon que le / n'ai aucune raison de se remplir sans une action directe de ma part (mises à jours, ajout volontaire de fichiers, etc).
Et puis en utilisant un peu de magie (et un peu de find), j'ai trouvé l'immonde coupable : .xsession-errors !
Ce petit impertinent est un fichier de log qui recense les erreurs graphiques de tout un tas d'applications, et en particulier des gestionnaire de fenêtres (Nemo dans mon cas). Situé à la racine de mon home, il a réussi à gonfler jusqu'à prendre 4 Go !
Comme il s'agit d'un fichier de log, je me demande bien ce qu'il peut faire ici au lieu d'être, par exemple, dans ... /var/log
! Ça use mon SSD pour rien en plus !
Bref.
Pour désactiver l'écriture des logs dans ce fichier :
/etc/X11/Xsession
;ERRFILE=$HOME/.xsession-errors
;ERRFILE=/dev/null
Au lieu d'écrire dans le fichier, les logs iront maintenant se perdre dans le vide sidéral.
Pour tester si une page existe sans la télécharger :
#!/bin/bash
# Renvoie "true" si la page passée en argument existe.
# @param $1 : l'URL de la page dont on veut tester l'existence.
# @return true si la page existe, false sinon.
is_URL_real()
{
local page_exists
page_exists="false"
if [[ `wget --server-response --spider "$1" 2>&1 | grep 'HTTP/1.1 200 OK'` ]]; then
page_exists="true"
fi
echo "$page_exists"
}
is_URL_real "$1"
Ce qui donne à l'exécution :
./test_URL.sh "https://www.qwant.com"
true
A propos des variables de type local en Bash.
Tout d'abord, la sécurité.
Afin d'écrire plus rapidement, on se retrouve souvent à déclarer et initialiser la variable en même temps :
local var="plouf plouf"
Sauf qu'en faisant ça, l'ordre d'exécution est le suivant :
Ce qui signifie que la variable reste accessible pendant un instant au niveau global. Il faut donc mieux faire la déclaration et l'instanciation en deux temps :
local var
var="plouf plouf"
Ce qui m'amène au deuxième point. Une fois qu'une variable a été déclarée local, il n'est pas besoin de remettre le mot-clef local à chaque instanciation. Ainsi, si je considère le script suivant :
#/usr/bin/env bash
ma_fonction()
{
local var = "ALEX"
echo "$var"
var="TOM"
echo "$var"
}
ma_fonction
echo "<$var>"
La sortie sera :
ALEX
TOM
<>
Un moyen de créer des répertoires plus rapidement.
Je veux créer des répertoires ayant un nom basé sur le même modèle. Par exemple REPERTOIRE.ABC.08
.
Pour créer tous les répertoires de 08 à 14, je peux utiliser une boucle for dans laquelle un compteur s'incrémente dans une string, laquelle est passée à mkdir.
Ou alors je peux utiliser une capacité de la commande mkdir :
mkdir REPERTOIRE.ABC.{08..14}
# Ce qui me donne :
ls -a
REPERTOIRE.ABC.08
REPERTOIRE.ABC.09
REPERTOIRE.ABC.10
REPERTOIRE.ABC.11
REPERTOIRE.ABC.12
REPERTOIRE.ABC.13
REPERTOIRE.ABC.14
Je peux utiliser une suite de lettres :
mkdir REPERTOIRE.{a..f}
# Ce qui me donne :
ls -a
REPERTOIRE.a
REPERTOIRE.b
REPERTOIRE.c
REPERTOIRE.d
REPERTOIRE.e
REPERTOIRE.f
Je peux utiliser plusieurs "suites" dans le même motif. Attention toutefois, car toutes les combinaisons seront créees :
mkdir REPERTOIRE.{a..c}_{0..3}
# Ce qui me donne :
ls -a
REPERTOIRE.a_0
REPERTOIRE.a_1
REPERTOIRE.a_2
REPERTOIRE.a_3
REPERTOIRE.b_0
...
REPERTOIRE.c_3
Le bonus de fin : je peux parcourir une suite de nombres avec un pas supérieur à 1 :
# Pour un pas de 2
mkdir REPERTOIRE.{1..7..2}
# Ce qui me donne :
ls -a
REPERTOIRE.1
REPERTOIRE.3
REPERTOIRE.5
REPERTOIRE.7
Edit : si au lieu d'une suite de caractères je veut utiliser une liste de valeurs prédéfinies je peux utiliser la virgule :
mkdir dossier_{toto,1,007,AZ}
# Ce qui me donne
ls -a
dossier_toto
dossier_1
dossier_007
dossier_AZ
Pour une arborescence, j'utilise aussi l'option -p :
mkdir -p parent{1..4}/enfant{bill,bob,ben}
# Ce qui me donne
tree
.
├── parent1
│ ├── enfantben
│ ├── enfantbill
│ └── enfantbob
├── parent2
│ ├── enfantben
│ ├── enfantbill
│ └── enfantbob
├── parent3
│ ├── enfantben
│ ├── enfantbill
│ └── enfantbob
└── parent4
├── enfantben
├── enfantbill
└── enfantbob
Pour mémoire.
Comment extraire la n-ème ligne d'une fichier en bash?
Soit le fichier suivant :
Ligne 01
Ligne 02
Ligne 03
Ligne 04
Ligne 05
Ligne 06
Ligne 07
Avec l'outil sed :
# J'extrais la 4eme ligne du fichier
cat mon_fichier | sed "4q;d"
# Ce qui donne
Ligne 04
# J'extrais la 67eme ligne (avec une variable)
var="67"
cat mon_fichier | sed "${var}q;d"