J'ai besoin de trouver tous les fichiers image du répertoire (gif, png, jpg, jpeg).
find /path/to/ -name "*.jpg" > log
Comment modifier cette chaîne pour trouver non seulement des fichiers .jpg?
Réponses:
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
marchera. Il pourrait y avoir une manière plus élégante.
find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -exec ls -l {} \;
sinon l'exécutable ne s'applique qu'à la dernière partie ( -iname '*.jpg'
dans ce cas).
find /path/to/ -iname '*.gif' -o -iname '*.jpg' -print0
n'imprimera que les fichiers jpg! Vous avez besoin de parenthèses ici:find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
find -E /path/to -regex ".*\.(jpg|gif|png|jpeg)" > log
Le -E
vous évite d'avoir à échapper aux parens et aux tuyaux de votre regex.
-E
option indique find
d'utiliser des "expressions régulières étendues". Plusieurs autres outils ont une option similaire, mais je ne suis pas sûr que cette option soit disponible sur toutes les distributions UNIX.
find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)"
.
find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log
. L'utilisation du -iregex
drapeau indique de find
faire correspondre la casse de manière insensible.
find /path/to/ -type f -print0 | xargs -0 file | grep -i image
Cela utilise la file
commande pour essayer de reconnaître le type de fichier, quel que soit le nom de fichier (ou l'extension).
Si /path/to
ou un nom de fichier contient la chaîne image
, alors ce qui précède peut renvoyer de faux hits. Dans ce cas, je suggérerais
cd /path/to
find . -type f -print0 | xargs -0 file --mime-type | grep -i image/
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)
-iname *.jpg
, -o -name *.jpeg
, -o -iname *gif
Tous ont un format légèrement différent.
dans le cas où les fichiers n'ont pas d'extension, nous pouvons rechercher le type de fichier mime
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }'
où (audio | video | matroska | mpeg) sont des types mime regex
& si vous souhaitez les supprimer:
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
rm "$f"
done
ou supprimez tout le reste sauf ces extensions:
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 !~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
rm "$f"
done
remarquez le! ~ au lieu de ~