Comment trouver des fichiers par type de fichier?

Je sais que je peux trouver des fichiers en utilisant find: find . -type f -name "sunrise" . Exemple de résultat:

./sunrise ./events/sunrise ./astronomy/sunrise ./schedule/sunrise 

Je sais aussi que je peux déterminer le type de fichier dun fichier: file sunrise. Exemple de résultat:

sunrise: PEM RSA private key 

Mais comment puis-je trouver des fichiers par type de fichier?

Par exemple, my-find . -type f -name "sunrise" -filetype=bash-script:

./astronomy/sunrise ./schedule/sunrise 

Commentaires

  • Il ny a pas de --filetype pour la commande find ou tout autre élément qui vous indiquera le type de fichier. La seule chose que vous pouvez faire est dutiliser --exec file {} \;, puis de le diriger vers grep Bourne si vous recherchiez des scripts bash ou grep Perl si vous recherchiez des scripts Perl ou quelque chose du genre.

Réponse

Les « types de fichiers » sur un système Unix sont des éléments tels que des fichiers normaux, des répertoires, des tubes nommés, des fichiers spéciaux de caractères, des liens symboliques, etc. fichiers sur lesquels find peuvent filtrer avec son option -type.

find ne peut pas à lui seul faire la distinction entre un « script shell », un « fichier image JPEG » ou tout autre type de fichier régulier . Ces types de données peuvent cependant être distingués par lutilitaire file, qui examine des signatures particulières dans les fichiers eux-mêmes pour déterminer leur type.

Une manière courante détiqueter les différents types de fichiers de données sont par leur type MIME , et file est capable de déterminer le type MIME dun file.


Utilisation de file avec find pour détecter le type MIME des fichiers normaux, et utilisez-le pour rechercher uniquement les scripts shell:

find . -type f -exec sh -c " case $( file -bi "$1" ) in */x-shellscript*) exit 0 esac exit 1" sh {} ";" -print 

ou, en utilisant bash,

find . -type f \ -exec bash -c "[[ "$( file -bi "$1" )" == */x-shellscript* ]]" bash {} ";" \ -print 

Ajoutez -name sunrise avant le -exec si vous souhaitez uniquement détecter les scripts portant ce nom.

La commande find ci-dessus trouvera tous les fichiers normaux dans ou en dessous du répertoire courant, et pour chacun de ces fichiers, appelez un court script shell en ligne. Ce script exécute file -bi sur le fichier trouvé et se termine avec un statut de sortie nul si la sortie de cette commande contient la chaîne /x-shellscript. Si la sortie ne contient pas cette chaîne, elle se termine avec un statut de sortie différent de zéro, ce qui fait que find continue immédiatement avec le fichier suivant. Sil savère que le fichier est un script shell, la commande find sortira le chemin daccès du fichier (le -print à la end, qui pourrait également être remplacé par une autre action).

La commande file -bi affichera le type MIME du fichier. Pour un script shell sous Linux ( et la plupart des autres systèmes), ce serait quelque chose comme

text/x-shellscript; charset=us-ascii 

sur des systèmes avec une variante légèrement plus ancienne de file, il peut sagir de

application/x-shellscript 

Le bit commun est la sous-chaîne /x-shellscript.

Notez que sous macOS, vous devrez utiliser file -bI au lieu de file -bi pour raisons (le -i fait quelque chose de tout à fait différent). La sortie sur macOS est similaire à celle dun système Linux.


Souhaitez-vous effectuer une action personnalisée sur chaque script shell trouvé, vous pouvez faire at avec un autre -exec à la place de -print dans les commandes find ci-dessus, mais il serait également possible de faire

find . -type f -exec sh -c " for pathname do case $( file -bi "$pathname" ) in */x-shellscript*) ;; *) continue esac # some code here that acts on "$pathname" done" sh {} + 

ou, avec bash,

find . -type f -exec bash -c " for pathname do [[ "$( file -bi "$pathname" )" != */x-shellscript* ]] && continue # some code here that acts on "$pathname" done" bash {} + 

Connexes:

Réponse

Vous pouvez exécuter find sur chaque fichier trouvé puis grep pour le résultat qui vous intéresse.

# When looking for ASCII Text find . -type -exec file {} \; | grep "ASCII" # or for MS Word Documents find . -type f -exec file {} \; | grep "Microsoft Word" 

Je suggère de rendre le modèle de recherche aussi proche que possible de votre attente de garder le nombre de les faux positifs correspondent à une valeur faible.

Attention, les fichiers avec des nouvelles lignes dans leurs noms de fichiers peuvent poser des problèmes avec cette approche.

Réponse

Utilisation du module perl » s File::LibMagic:

perl -MFile::LibMagic=:easy -MFile::Find -le " find sub { print $File::Find::name if $_ eq "sunrise" and -f and MagicFile$_ eq "PEM RSA private key" }, @ARGV" -- . 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *