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?
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.
la source
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.la source
-E
option indiquefind
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 defind
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îneimage
, alors ce qui précède peut renvoyer de faux hits. Dans ce cas, je suggéreraiscd /path/to find . -type f -print0 | xargs -0 file --mime-type | grep -i image/
la source
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)
la source
-iname *.jpg
,-o -name *.jpeg
,-o -iname *gif
Tous ont un format légèrement différent.En complément de la réponse de @Dennis Williamson ci-dessus, si vous voulez que la même expression régulière soit insensible à la casse pour les extensions de fichier, utilisez -iregex:
find /path/to -iregex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
la source
Sur l'utilisation de Mac OS
find -E packages -regex ".*\.(jpg|gif|png|jpeg)"
la source
find -regex ".*\.\(jpg\|gif\|png\|jpeg\)"
la source
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 ~
la source