Table des matières

Divers

Cette page est un fourre-tout de tout ce qui ne peut pas faire l'objet d'une page. Quand il y aura plusieurs choses qui pourront faire l'objet d'une page, elles seront déplacées.

# génération d'une archive en changeant les chemins des fichiers
tar -C test.tar/ --transform="s/\./hello/" --transform="s/toto1/tata/" -cvzf tar.tar .
 
# génération d'un pdf à partir d'un md
pandoc --from=markdown --to=latex -o Config.Switch.pdf --toc -N -V colorlinks -H head.tex -V geometry:"top=2cm,bottom=2cm,left=2cm,right=2cm" Config.Switch.md

Modifier le contenu d'un fichier avec Perl

perl -i -p -e 's/search/replacement/g' <fichier>

Bien sur il est possible de le faire depuis l'interface web. C'est facile mais pas très rapide. Il est aussi possible de le faire depuis la console en utilisant cURL.

curl -u '<utilisateur>:<mot de passe>' 'http://192.168.0.1/reboot.xgi'

Et pour aller encore plus vite, pourquoi ne pas en faire un alias.

Concaténer des fichiers sous Windows

Il est possible de contaténer différents fichiers et de les afficher sur la sortie standard.

type <fichier1> <fichier2>

Déplacer des colonnes de données dans Excel

Il y a la méthode fastidieuse qui consiste à sélectionner les colonnes, les copier, insérer des colonnes vides, coller le contenu des copiées, supprimer les colonnes copiées.

Il y a aussi la méthode simple qui consiste à sélectionner les colonnes et les déplacer en appuyant sur la touche Shift et en cliquant sur l'icône de déplacement.

Relancer l'explorer de Windows

Après une mise à jour de Git pour Windows, j'ai eu ma barre de tâche qui a disparue. Il suffit de relancer le programme explorer.exe.

Copier un répertoire avec rsync

# Version courte
rsync -avz --delete --force <source> <destination>
 
# Version courte étendue
rsync -rlptgoDvz --delete --force <source> <destination>
 
# Version longue
rsync --archive --verbose --compress --delete --force <source> <destination>
 
# Version longue étendue
rsync --recursive --links --perms --times --group --owner --devices --specials --verbose --compress --delete --force <source> <destination>

Afficher la liste des paquets installés avec Cygwin

cygcheck --check-setup
# Version courte
wget -r -l2 -H --spider -np -D ainw.org -nv -T 20 https://www.ainw.org
 
# Version longue
wget --recursive --level=2 --span-hosts --spider --no-parent --domains=ainw.org --no-verbose --timeout=20 http://www.ainw.org

Extraire les images d'un site

# Version courte
wget -nd -r -P ainw.org -Ajpg,jpeg --reject-regex ".*thumb.*" -l2 https://www.ainw.org
 
# Version longue
wget --no-directories --recursive --directory-prefix ainw.org --accept jpg,jpeg --reject-regex ".*thumb.*" --level 2 https://www.ainw.org

Extraire des fichiers d'une archive en ligne

# Version courte
curl -L https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz | tar -x -J -f - -C /usr/local/sbin --strip 2 wkhtmltox/bin/wkhtmltopdf wkhtmltox/bin/wkhtmltoimage
 
# Version longue
curl --location https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz | tar --extract --xz --file - --directory /usr/local/sbin --strip 2 wkhtmltox/bin/wkhtmltopdf wkhtmltox/bin/wkhtmltoimage

Cette syntaxe est obligatoire lors de l'écriture de fichier Docker. Dans le cas de l'utilisation dans bash, on peut écrire la commande différemment :

curl -L https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz | tar -x -J -f - -C /usr/local/sbin --strip 2 wkhtmltox/bin/wkhtmlto{pdf,image}

Renommer des fichiers

Pour renommer des fichiers numérotés avec espaces de la forme mon fichier 01.txt en 01-mon fichier 01.txt, on peut utiliser sed et mv de la manière suivante :

IFS=$'\n'
for SOURCE in *; do
    TARGET=$(echo $SOURCE| sed -e 's/\(.*\([0-9][0-9]\).*\)/\2-\1/')
    mv $SOURCE $TARGET
done
IFS=$' \t\n'

Il faut noter que l'utilisation de sed dans cette configuration est gourmande. Si on essaye de renommer mon fichier 01 - 55.txt, on aura le fichier 55-mon fichier 01 - 55.txt au lieu de 01-mon fichier 01 - 55.txt. Dans ce cas, il faudra utiliser la commande suivante :

IFS=$'\n'
for SOURCE in *; do
    TARGET=$(echo $SOURCE| sed -e 's/\([^0-9]*\([0-9][0-9]\).*\)/\2-\1/')
    mv $SOURCE $TARGET
done
IFS=$' \t\n'

Il existe aussi un script Perl qui permet de faire cela à l'aide d'expressions régulières. Il est installé par défaut sur certaines distributions (ex : Ubuntu) mais pas sur d'autres (ex : Archlinux). On peut l'utiliser de la manière suivante :

# Renommer "fichier1" et "fichier2" en "fichier1.bak" et "fichier2.bak"
rename 's/$/.bak/' fichier{1,2}
 
# Renommer "fichier 1" et "fichier 2" en "fichier1.bak" et "fichier2.bak"
rename 's/ ([1,2])$/$1.bak/' fichier\ {1,2}
 
# Renommer "premier gros fichier" en "premier.Gros.Fichier"
rename 's/ (.)/.\u$1/g' premier\ gros\ fichier
 
# Renommer "exemple d'un gros fichier" en "exemple.D.Un.Gros.Fichier"
rename 's/[ '"'"'](.)/.\u$1/g' exemple\ d\'un\ gros\ fichier
 
# Renommer "fichier1" et "fichier2" en "FICHIER1" et "FICHIER2"
rename 's/(.)/\u$1/g' fichier{1,2}
rename 'y/a-z/A-Z/' fichier{1,2}
 
# Renommer "FICHIER1" et "FICHIER2" en "fichier1" et "fichier2"
rename 's/(.)/\l$1/g' FICHIER{1,2}
rename 'y/A-Z/a-z/' FICHIER{1,2}

Sur Ubuntu, les commandes sont utilisables directement. Sur Archlinux, il faut préfixer toutes les commandes par perl-. Par exemple :

perl-rename 's/$/.bak/' fichier{1,2}
# au lieu de
rename 's/$/.bak/' fichier{1,2}

Ajouter un type dans ack

Il faut modifier le fichier .ackrc et utiliser --type-set de la manière suivante :

.ackrc
# Type défini par une seule extension
--type-set=api:ext:apib

# Type défini par plusieurs extensions
--type-set=markdown:ext:md,apib

# Type défini par un motif
--type-set=blade:match:/blade\.php$/

On peut visualiser le nouveau type en lançant la commande :

ack --help-types

Pour plus d'information, voir ici et dans la documentation officielle

Ne pas chercher dans un répertoire avec ack

Il faut modifier le fichier .ackrc et utiliser --ignore-dir de la manière suivante :

.ackrc
--ignore-dir=<dirname>

Cette option peut être utilisées plusieurs fois pour ignorer plusieurs répertoires. Elle ne supporte que les noms de répertoires simples. Elle peut-être aussi utilisée directement lors de l'exécution de ack.

Extraire une liste de chaînes de caractères

J'ai envie de récupérer l'ensemble des codes d'erreurs générés par mon API pour pouvoir les documenter.

# Version courte
grep -roh --exclude="*.apib" "api.error[^'\"]*" src/
 
# Version longue
grep --recursive --only-matching --no-filename --exclude="*.apib" "api.error[^'\"]*" src/

Redirection du traffic en HTTPS avec Apache

Il faut placer un fichier .htaccess à la racine du site avec le contenu suivant :

.htaccess
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

Trouver les lignes communes à 2 fichier

Il faut utiliser la commande comm. Celle-ci va afficher le résultat sous la forme de 3 colonnes. La première contient les lignes présentes uniquement dans le premier fichier, la seconde contient les lignes présentes uniquement dans le second fichier, la troisième contient les lignes communes aux 2 fichiers. Il est possible de n'afficher que certaines colonnes en pointant celles que l'on veut supprimer.

# Affiche les 3 colonnes
comm -- a.txt b.txt
 
# Affiche les lignes qui ne sont que dans un des 2 fichiers
comm -12 -- a.txt b.txt
 
# Affiche les lignes communes aux 2 fichiers
comm -3 -- a.txt b.txt

Vérifier la somme de contrôle d'un fichier

La somme de contrôle1) est le résultat, de longueur fixe, de la transformation d'un fichier par une fonction de hachage. Selon la théorie des codes, à chaque empreinte correspond un seul et unique fichier. Mais ce n'est que de la théorie, car la recherche faisant des progrès, ce n'est plus tout à fait vrai. De ce fait, il est facile ensuite de vérifier si le fichier est bien ce qu'il prétend être en comparant son empreinte réelle avec son empreinte théorique.

Il existe différentes fonctions de hachages, mais les plus courantes (en tout cas sur GNU/Linux) sont MD5, SHA1 et SHA256. On préfèrera l'utilisation de l'algorithme SHA pour des raisons évidentes de sécurité.

# Première méthode — Avec un programme externe
echo "<chaîne de contrôle>" | sha256sum -c -
 
# Deuxième méthode — Avec une chaîne here-string
sha256sum -c - <<< "<chaîne de contrôle>"
 
# Troisième méthode — Avec un fichier
sha256sum -c <fichier de contrôle>

La chaîne de contrôle est composée de l'empreinte du fichier à vérifier, d'un espace, d'un astérisque et du nom de fichier à vérifier dans cette ordre. Par exemple, 47ccc37db256387b70857f53a6067e8d50e692c9aa85e45e63e5190c5d1e0942 *Fedora-13-i686-Live.iso.

Le fichier de contrôle contient une chaîne de contrôle par ligne, ce qui permet de traiter plusieurs vérifications simultanément.

Envoyer un courriel

cat message.A.Envoyer | mail -s "Sujet du message" -a 'From: "Mon nom" <from@example.org>' -b bcc@example.org -c cc@example.org to@example.org
  • Voir si je peux utiliser la syntaxe here-string.
  • Voir si je peux utiliser la syntaxe complète pour les adresses.

Lancer un programme Java

# Sans paramètre
java -jar <fichier JAR>
 
# Avec l'utilisation d'un répertoire externe (utile pour l'inclusion de bibliothèques) 
java -Djava.ext.dirs=/usr/share/java/ -jar <fichier JAR>

Lancer un serveur HTTP

Depuis n'importe quel répertoire, il faut lancer la commande suivante :

python -m http.server

Récupérer l'identifiant d'une chaîne Youtube

document.querySelector('meta[itemprop="channelId"]').content

Afficher les entêtes d'une requête HTTP avec cURL

curl -D - www.ainw.org -o /dev/null

Partager un point d'accès WiFi avec un QR-code

# Génère un QR-code
qrencode -s 7 -l H -o Guest.Wifi.png 'WIFI:S:<SSID>;T:<WEP|WPA|blank>;P:<PASSWORD>;H:<true|false|blank>;;'
 
# Génère un QR-code avec icône au centre
qrencode -s 7 -l H -o - 'WIFI:S:<SSID>;T:<WEP|WPA|blank>;P:<PASSWORD>;H:<true|false|blank>;;' | \
convert - -gravity center \
\( /usr/share/icons/Adwaita/64x64/status/network-wireless-signal-excellent-symbolic.symbolic.png -bordercolor white -border 10x10 -bordercolor black -border 5x5 \) \
-composite -trim -bordercolor white -border 10x10 -bordercolor black -border 1x1 wifi.png
 
# Génère un QR-code avec icône au centre ainsi que les informations en clair
qrencode -s 7 -l H -o - 'WIFI:S:<SSID>;T:<WEP|WPA|blank>;P:<PASSWORD>;H:<true|false|blank>;;' | \
convert \( - -gravity center \( /usr/share/icons/Adwaita/64x64/status/network-wireless-signal-excellent-symbolic.symbolic.png \
 -bordercolor white -border 10x10 -bordercolor black -border 5x5 \) -composite -trim -bordercolor white -border 10x10 \) \
\( -size 500x500 xc:white -font /usr/share/fonts/TTF/DejaVuSansMono.ttf -fill black -pointsize 16 -draw "text 0,16 'SSID: <SSID>'" \
 -trim -bordercolor white -border 10x10 \) \( -size 500x500 xc:white -font /usr/share/fonts/TTF/DejaVuSansMono.ttf -fill black \
-pointsize 16 -draw "text 0,16 'PWD: <PASSWORD>'" -trim -bordercolor white -border 10x10 \) -gravity center -append -border color black -border 1x1 wifi.png
1)
Aussi appelée empreinte