====== 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 =====
* **-l** : utiliser un format d'affichage long (càd. afficher toutes les informations de droits, taille, date...)
* **-h** : pour //human-readable//, avec -l ou -s, afficher les tailles en format lisible (par exemple 1K, 234M ou 2G)
# 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"
* **-a** : pour //all//, permet d'afficher aussi les fichiers cachés
* **-R** : pour //recursive//, permet de parcourir les dossiers
* **-t** : pour trier les fichier par date de modification, du plus récent au plus ancien
* **-r** : pour inverser le sens de tri
* **-S** : pour trier les fichier par taille, du plus gros au plus petit
# 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 :
* mtime : dernière modification du contenu (pas des attributs)
* ctime : dernière modification du contenu OU des attributs (:!: pas la date de création)
* atime : dernier accès
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 :
* ''c'' pour compresser
* ''v'' pour verbose
* ''f'' cible = un fichier
* ''z'' pour GNU Zip, ''j'' pour BZ2 **:!: plus nécessaire**
=== Ne pas inclure toute le hiérarchie des dossiers ===
* ''--directory='' suivi du dossier racine à partir duqul archiver
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 : ((https://stackoverflow.com/a/16957078))
# -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/''
[Unit]
Description=Automount Eddie Music Making
[Automount]
Where=/mnt/eddie/musicmaking
[Install]
WantedBy=multi-user.target
[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 : ===
[Unit]
Description=Automount Eddie Musique
[Automount]
Where=/mnt/eddie/musique
[Install]
WantedBy=multi-user.target
[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 :
[Unit]
Description=Automount Eddie Vidéos
[Automount]
Where=/mnt/eddie/videos
[Install]
WantedBy=multi-user.target
[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 : [[https://doc.ubuntu-fr.org/tutoriel/gestion_utilisateurs_et_groupes_en_ligne_de_commande#ajouter_un_utilisateur_a_un_groupe|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 \;