Table des matières

Commandes Unix

Créer un dossier

Créer un dossier et ses parents s'ils n'existent pas encore :

mkdir -p /foo/bar/zoo/andsoforth

Copie

cp -R source nomcopie 

Liens symboliques

ln -s cible nom_lien 

Lister les fichiers

# Lister les fichiers et dossiers du répertoire courant, avec tous les détails, et les tailles compréhensibles par un humain
ls -lh
# Créer un alias pour cette commmande
alias ll="ls -lh"
# Lister les fichiers avec un filtre sur leur nom
ls *.pdf

Droits

Désigner le propriétaire d'un fichier :

chown owner:group fichier
# Récursif : 
chown -hR owner:group dossier

Rendre un fichier exécutable pour son propriétaire :

chmod u+x fichier.sh

Positionner les droits de tous les fichiers à lecture écriture pour le proprio, lecture seule pour les autres :

# Version bash
find . -type f -exec chmod 644 {} \;
#Version busybox
find "/shares/Public/Shared Videos" -type f -exec chmod u=rw,g=r,o=r \"{}\" \;

Dates

Pour analyser les différentes dates des fichiers et répertoire, en passant par un fichier CSV :

cd DOSSIER_A_ANALYSER
printf "nom;mtime (modification);ctime (status change);atime (access)\n" > ~/times.csv
find . -printf "%P;%Td/%Tm/%TY;%Cd/%Cm/%CY;%Ad/%Am/%AY\n" >> ~/times.csv

Pour rappel les dates sont :

Source : https://www.quora.com/What-is-the-difference-between-mtime-atime-and-ctime

Récupérer les fichiers modifiés dans les 15 derniers jours avec leur date/heure de modification :

find ./ -type f -mtime -15 -printf "%p;%TY-%Tm-%Td %TH:%TM\n" > fichiers-modifies.csv

Archives

Décompresser

tar xvf something.tar.bz2
unzip something.zip
unrar x "nom de fichier.rar"

Exclure un dossier

tar xvf something.tar.bz2 --exclude="folder"

Spécifier cible et créer un dossier

# Créer dossier /var/www/nom-archive et y extraire l'archive
tar xvf /home/ajacquemin/nom-archive.tar.xz --directory /var/www --one-top-level
# Créer dossier /var/www/nom-specifie et y extraire l'archive
tar xvf /home/ajacquemin/nom-archive.tar.xz --directory /var/www --one-top-level=nom-specifie

Compresser

tar cvf repertoire.tar.bz2 repertoire/ 

Paramètres :

Ne pas inclure toute le hiérarchie des dossiers

tar cvf archive.tar.bz2 --directory=/var/www dossier

Supprimer les fichiers source après compression

tar cjvf repertoire.tar.bz2 repertoire/ --remove-files

Chercher un fichier

find ./ -name NOM_FICHIER
find ./ -name *.EXTENSION

Chercher à l'intérieur des fichiers

En connaissant l'extension, obtenir la liste des fichiers qui contiennent une chaîne :

find ./ -name \*.php | xargs grep "\x63\x72\x65\x61\x74\x65\x5f\x66"

Ou autre version plus simple, avec grep uniquement : 1)

# -r or -R is recursive,
# -n is line number, and
# -w stands for match the whole word.
# -e is the pattern used during the search
grep --include=\*.{php,yml} -rnw '/path/to/somewhere/' -e "pattern"

Sans connaître l'extension :

grep -rwl './' -e "chaine"

Supprimer fichiers selon leur nom

find . -type f -name ".directory" -exec rm -i {} \;

Supprimer fichiers selon leur date

find . -name "truc" -mtime +15 -type f -delete

Supprimer dossiers vides

find . -mindepth 1 -type d -empty -delete;

SSH

Se connecter

ssh user@host [-p port]

Copier un fichier

Envoyer un fichier local vers une machine distante :

scp /source/fichier  user@host:repertoiredistant

Télécharger un fichier depuis une machine distante :

scp user@host:repertoiredistant/fichier /cible/

MD5

Calculer les hashs de tous les fichiers d'un dossier :

find ./dossier -type f -print0 | xargs -0 md5sum > checksums.md5

Vérifier que tous les fichiers sont corrects d'après un fichier de hash :

md5sum -c checksums.md5

Multimédia

Audio, vidéo… déplacés sur la page ffmpeg

Retirer metatags de toutes les photos d'un dossier

exiftool -r -all= -ext jpg -ext gif -ext png /path/to/top/directory/ 

Retirer les premières secondes de plusieurs mp3

find ./ -name '*.mp3' -type f -exec mp3splt -a -f {} 00.10.50 EOF -o "trim/@f" \;

Téléchargement

Faire un miroir d'un site (attendre 4 secondes entre chaque page, convertir les extensions en .html, permettre d'actualiser l'archive )

wget --mirror --convert-links --backup-converted --html-extension -w 4 http://example.com/ -o log.txt
 
# version condensée, sans la réécriture des extension, sans permettre l'actualisation de l'archive
wget -mk -w 4 http://www.example.com

Juste une page et ses liens :

wget -r -N -w 4 -l 2 --no-remove-listing http://www.example.com

http://www.gnu.org/software/wget/manual/wget.html#Examples

Nombre de fichiers dans chaque dossier

find . -type f -iname '*.jp*g' -printf "%h\n" | sort | uniq -c > count.txt

Espace disque utilisé / libre

Toutes les partitions

df -h

Résultat :

Sys. de fich.            Tail. Occ. Disp. %Occ. Monté sur
/dev/sda1             9,2G  5,9G  2,9G  68% /
tmpfs                 499M     0  499M   0% /lib/init/rw
varrun                499M  332K  498M   1% /var/run
varlock               499M     0  499M   0% /var/lock
udev                  499M  152K  498M   1% /dev
tmpfs                 499M   12K  498M   1% /dev/shm
lrm                   499M  1,6M  497M   1% /lib/modules/2.6.28-12-netbook-eeepc/volatile
/dev/sda3              65G   61G  600M 100% /home
/dev/sda5             155G  126G   21G  87% /media/partage

Pour un répertoire

sudo du -sh /tmp
60K     /tmp

Le contenu d'un répertoire

sudo du -h /usr/src --max-depth=1
7,7M    /usr/src/linux-headers-2.6.28-19-generic
64M     /usr/src/linux-headers-2.6.28-19
52K     /usr/src/rpm
72M     /usr/src

Noyaux actuellement utilisé

uname -r
2.6.28-12-netbook-eeepc

Monter automatiquement NFS

Version intiale

Dans /etc/fstab :

192.168.0.97:/nfs/Public	/media/nas/Public	nfs	user,rw,hard,intr	0	0

Source : https://help.ubuntu.com/community/SettingUpNFSHowTo#Mounts

Version 2017 (autofs)

Dans /etc/auto.eddie

music   -fstype=nfs,rw,intr   192.168.0.42:/volume1/music
music-making   -fstype=nfs,rw,intr   192.168.0.42:/volume1/music-making
photo   -fstype=nfs,rw,intr   192.168.0.42:/volume1/photo
video   -fstype=nfs,rw,intr   192.168.0.42:/volume1/video
public   -fstype=nfs,rw,intr   192.168.0.42:/volume1/public

Version 2021 (systemd)

Créer deux fichiers dans /etc/systemd/system/

mnt-eddie-musicmaking.automount
[Unit]
Description=Automount Eddie Music Making
 
[Automount]
Where=/mnt/eddie/musicmaking
 
[Install]
WantedBy=multi-user.target
mnt-eddie-musicmaking.mount
[Unit]
Description=Eddie Music Making
 
[Mount]
What=192.168.0.42:/volume1/music-making
Where=/mnt/eddie/musicmaking
Type=nfs
 
[Install]
WantedBy=multi-user.target

Pour la musique :

mnt-eddie-musique.automount
[Unit]
Description=Automount Eddie Musique
 
[Automount]
Where=/mnt/eddie/musique
 
[Install]
WantedBy=multi-user.target
mnt-eddie-musique.mount
[Unit]
Description=Eddie Musique
 
[Mount]
What=192.168.0.42:/volume1/music
Where=/mnt/eddie/musique
Type=nfs
 
[Install]
WantedBy=multi-user.target

Pour les vidéos :

mnt-eddie-videos.automount
[Unit]
Description=Automount Eddie Vidéos
 
[Automount]
Where=/mnt/eddie/videos
 
[Install]
WantedBy=multi-user.target
mnt-eddie-videos.mount
[Unit]
Description=Eddie Vidéos
 
[Mount]
What=192.168.0.42:/volume1/video
Where=/mnt/eddie/videos
Type=nfs
 
[Install]
WantedBy=multi-user.target

Annoncer ces fichiers à systemd :

systemctl daemon-reload
systemctl start mnt-eddie-musicmaking.automount

Source : https://blog.tomecek.net/post/automount-with-systemd/

Copier stdout et stderr dans un fichier

Tout en continuant à les afficher à l'écran !

ftp -v -u -n -d < ${FTP_COMMAND_FILE} 2>&1 | tee $FTP_RETOUR_FILE

Vérifier réussite FTP

Le code retour du client FTP est 0, même si le transfert n'est pas effectué. La solution est d'enregistrer les échanges dans un fichier et de chercher si celui-ci contient le message de réussite.

FTP_SUCCESS_MSG="226 Transfer complete"
ftp  -v -u -n -d < ${FTP_COMMAND_FILE} &>$FTP_RETOUR_FILE
if fgrep "$FTP_SUCCESS_MSG" $FTP_RETOUR_FILE ;then
	echo "   [OK]"
else
	echo "   [KO]"
fi

Ou plus simple : utiliser lftp

Remplacer motif dans un fichier

Dans cet exemple, remplacer toutes les tabulations suivies d'un pipe par un pipe uniquement :

sed -i 's/\t|/|/' monfichier.txt

-i signifie “faire la modification directement dans le fichier source”.

Gérer les utilisateurs

Créer un utilisateur

sudo useradd nom_utilisateur

Créer un groupe

sudo groupadd nom_groupe

Ajouter un utilisateur dans un groupe

sudo adduser nom_utilisateur nom_groupe

Il faut fermer/ré-ouvrir la session utilisateur pour que ce soit pris en compte (dommage !)

Source : Wiki Ubuntu-fr > Gestion des utilisateurs et groupes en ligne de commande

Reformater des fichiers SQL

sudo pipx install sqlparse
pipx ensurepath
find . -type f -exec sqlformat --reindent {} -o {}.sql \;