Outils pour utilisateurs

Outils du site


informatique:outils:find_xargs

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
informatique:outils:find_xargs [2025/01/02 09:21] – supprimée - modification externe (Date inconnue) 127.0.0.1informatique:outils:find_xargs [2025/01/02 09:21] (Version actuelle) – ↷ Page déplacée de informatique:find_xargs à informatique:outils:find_xargs alexis
Ligne 1: Ligne 1:
 +====== Find & xargs ======
 +Find est un outil permettant de rechercher des fichiers sur le disque.\\ 
 +Xargs est un outil qui permet de construire des commandes depuis l'entrée standard. L'intérêt de cette commande est de respecter la longueur maximale de la commande. Par exemple :
 +<code bash>
 +# Si le nombre de fichier est très important, la commande suivante sera interrompu par des erreurs
 +rm -Rf -- ./*
  
 +# Il faut donc utiliser la commande suivante
 +find . | xargs rm -Rf --
 +</code>
 +
 +===== Décompresser plusieurs fichiers =====
 +<code bash>
 +# Version courte
 +find . -iname \*tar.gz -print0 | xargs -0 -n1 -r tar -zxf
 +
 +# Version longue
 +find . -iname \*tar.gz -print0 | xargs --null --max-args=1 --no-run-if-empty tar --gzip --extract --file
 +</code>
 +  * Options de ''find'' :
 +    * ''%%-iname%%'' permet de rechercher par nom de fichier sans tenir compte de la casse.
 +    * ''%%-print0%%'' permet d'afficher la liste des fichiers séparés par un caractère NUL au lieu d'un caractère de fin de ligne. Cela permet de gérer les fichiers contenant des espaces dans leur nom.
 +  * Options de ''xargs'' :
 +    * ''%%-0%%'' ou ''%%--null%%'' permet d'interpréter le caractère NUL utilisé comme délimiteur.
 +    * ''%%-n1%%'' ou ''%%--max-args=1%%'' permet de limiter le nombre de fichier transmis à 1 car dans notre cas, //tar// ne supporte qu'un seul paramètre.
 +    * ''%%-r%%'' ou ''%%--no-run-if-empty%%'' permet de ne pas lancer la commande s'il n'y a pas de fichiers à traiter.
 +  * Options de ''tar'' :
 +    * ''%%-z%%'' ou ''%%--gzip%%'' permet d'utiliser la compression gzip.
 +    * ''%%-x%%'' ou ''%%--extract%%'' permet d'extraire les fichiers d'une archive.
 +    * ''%%-f%%'' ou ''%%--file%%'' permet d'utiliser un fichier archive.
 +
 +Bien sur il faut faire correspondre les options de ''tar'' avec les fichiers recherchés.
 +
 +===== Changer l'utilisateur de fichiers (y compris les fichiers point) =====
 +Si on utilise la commande ''chown'' directement, les fichiers point (ou dotfiles en anglais) ne sont pas modifiés à moins de les sélectionner un par un.
 +Si on n'en a qu'un a modifier, ce n'est pas un vrai problème. Dans le cas contraire, cela risque d'être contraignant.
 +
 +Pour pallier à ça, il suffit de lancer la commande suivante :
 +<code bash>
 +find . -user <utilisateur> | xargs chown -R <utilisateur>
 +</code>
 +
 +Et ça fonctionne de la même façon pour les groupes :
 +<code bash>
 +find . -group <groupe> | xargs chgrp -R <groupe>
 +</code>
 +
 +===== Lancer plusieurs vidéos simultanément =====
 +<code bash>
 +# Version courte
 +find . -iname \*mp4 -print0 | xargs -P10 -n1 -0 cvlc --noaudio --L
 +
 +# Version longue
 +find . -iname \*mp4 -print0 | xargs --max-process=10 --max-args=1 --null cvlc --noaudio --loop
 +
 +# Version courte filtrée
 +find . -iname \*mp4 -print0 | head -n10 -z | tail -n6 -z | xargs -P10 -n1 -0 cvlc --noaudio --L
 +
 +# Version longue filtrée
 +find . -iname \*mp4 -print0 | head --lines=10 --zero-terminated | tail --lines=6 --zero-terminated | xargs --max-process=10 --max-args=1 --null cvlc --noaudio --loop
 +</code>
 +
 +<code bash>
 +# Par défaut, xargs positionne les arguments reçus en fin de ligne.
 +# Pour utiliser les arguments à un autre endroit, il faut utiliser une chaine de remplacement. Ici, {}
 +find . -iname \*mp4 -print0 | xargs -P10 -n1 -0 -I '{}' cvlc --noaudio {} vlc://quit
 +</code>
 +
 +  * Options de ''find''
 +    * ''%%-iname%%'' permet de rechercher par nom de fichier sans tenir compte de la casse.
 +    * ''%%-print0%%'' permet d'afficher la liste des fichiers séparés par un caractère NUL au lieu d'un caractère de fin de ligne. Cela permet de gérer les fichiers contenant des espaces dans leur nom.
 +  * Options de ''head'' et de ''tail''
 +    * ''%%-n10%%'' ou ''%%--lines=10%%'' permet de prendre les 10 premières lignes.
 +    * ''%%-z%%'' ou ''%%--zero-terminated%%'' permet d'interpréter le caractère NUL utilisé comme délimiteur.
 +  * Options de ''xargs''
 +    * ''%%-P10%%'' ou ''%%--max-process=10%%'' permet de limiter le nombre de commande lancées simultanément.
 +    * ''%%-n1%%'' ou ''%%--max-args=1%%'' permet de limiter le nombre de fichier transmis à 1 car dans notre cas, //cvlc// ne jouera qu'une seule vidéo.
 +    * ''%%-0%%'' ou ''%%--null%%'' permet d'interpréter le caractère NUL utilisé comme délimiteur.
 +    * ''%%-I '{}'%%'' permet de remplacer la chaine ''{}'' par les arguments reçus.
 +  * Options de ''cvlc''
 +    * ''%%--noaudio%%'' permet de couper le son.
 +    * ''%%-L%%'' ou ''%%--loop%%'' permet de jouer la vidéo en boucle.
 +    * ''%%vlc://quit%%'' est un nom de fichier factice qui permet de quitter vlc.
 +
 +===== Supprimer tous les répertoires vides du répertoire courant =====
 +<code bash>
 +# Du répertoire courant uniquement
 +find . -maxdepth 1 -type d -empty -delete
 +
 +# Récursivement, un répertoire ne contenant que des répertoires vides sera supprimé
 +find . -type d -empty -delete
 +</code>
 +
 +<WRAP important>
 +Il est impératif de positionner ''-maxdepth 1'' au début pour ne pas avoir d'alerte. En effet, ''maxdepth'' est une option et de ce fait doit être positionné avant les tests. Ici ''type'' et ''empty''
 +</WRAP>
 +
 +
 +===== Lancer plusieurs commandes =====
 +<code bash>
 +find . | xargs -n1 -I '{}' sh -c "<command> {}; <command> {}"
 +</code>
 +
 +===== Afficher l'ensemble des fichiers en excluant certains répertoires =====
 +<code bash>
 +find . -not -path "./vendor/*" -not -path "./var/*" -not -path "./hooks/*" -print
 +</code>