Ceci est une ancienne révision du document !
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 :
cpour compresservpour verbosefcible = un fichierzpour GNU Zip,jpour BZ2plus 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 : 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
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
Compresser en flac récursivement
shopt -s globstar nocaseglob for input in GigaSoundPack/**/*.wav do indir=$(dirname "$input") outdir=${indir/#GigaSoundPack/GigaSoundFlac} [ ! -d "$outdir" ] && mkdir -p "$outdir" infile=$(basename "$input") outfile=${infile%.???}.flac ffmpeg -i "$input" "${outdir}/${outfile}" done
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" \;
Extraire l'audio d'une vidéo
ffmpeg -ss 300 -t 180 -i "input.avi" output.flac
Remplacer
- 300 par la position de départ (en secondes)
- 180 par la durée à capturer
- input.avi par le fichier d'où extraire
- output.flac par le fichier de destination
Concaténer deux vidéos de même format
ffmpeg -i video1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts ffmpeg -i video2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4
Source : http://trac.ffmpeg.org/wiki/Concatenate#protocol
Recompresser une vidéo en H264
ffmpeg -i "source.mp4" -vcodec libx264 -crf 20 "resultat.mp4"
Diminuer la valeur de CRF pour augmenter la qualité, et augmenter cette valeur pour diminuer la taille.
Source : https://unix.stackexchange.com/questions/28803/how-can-i-reduce-a-videos-size-with-ffmpeg#
- Pour changer le nombre d'images par secondes : paramètre -r
- Pour changer la résolution : paramètre -s
ffmpeg -i "source.mp4" -vcodec libx264 -crf 20 -r 20 -s 360x640 "resultat.mp4"
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 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/videos 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”.