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' -print0n'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 -Evous évite d'avoir à échapper aux parens et aux tuyaux de votre regex.
-Eoption indique findd'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 -iregexdrapeau indique de findfaire correspondre la casse de manière insensible.
find /path/to/ -type f -print0 | xargs -0 file | grep -i image
Cela utilise la filecommande pour essayer de reconnaître le type de fichier, quel que soit le nom de fichier (ou l'extension).
Si /path/toou 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 *gifTous 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 ~