Les "types de fichiers" sur un système Unix sont des choses comme des fichiers normaux, des répertoires, des canaux nommés, des fichiers spéciaux de caractères, des liens symboliques, etc. Ce sont les types de fichiers qui find
peuvent filtrer avec son -type
option.
L' find
utilitaire ne peut pas à lui seul faire la distinction entre un "script shell", un "fichier image JPEG" ou tout autre type de fichier standard . Ces types de données peuvent cependant être distingués par l' file
utilitaire, qui examine des signatures particulières dans les fichiers eux-mêmes pour déterminer leur type.
Une façon courante d'étiqueter les différents types de fichiers de données est leur type MIME et file
est capable de déterminer le type MIME d'un fichier.
Utiliser file
avec find
pour détecter le type MIME de fichiers normaux et l'utiliser pour rechercher uniquement des 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 -exec
si vous ne souhaitez détecter que les scripts portant ce nom.
La find
commande 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 s'exécute file -bi
sur le fichier trouvé et se termine avec un état 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 état de sortie différent de zéro, ce qui entraîne la find
poursuite immédiate du fichier suivant. Si le fichier s'avère être un script shell, la find
commande procédera à la sortie du chemin d'accès du fichier (le -print
à la fin, qui pourrait également être remplacé par une autre action).
La file -bi
commande affichera le type MIME du fichier. Pour un script shell sur Linux (et la plupart des autres systèmes), ce serait quelque chose comme
text/x-shellscript; charset=us-ascii
tandis que sur les systèmes avec une variante légèrement plus ancienne de l' file
utilitaire, il peut être
application/x-shellscript
Le bit commun est la /x-shellscript
sous - chaîne.
Notez que sur macOS, vous devrez utiliser file -bI
plutôt file -bi
que pour des raisons (l' -i
option fait quelque chose de très différent). La sortie sur macOS est similaire à celle d'un système Linux.
Souhaitez-vous effectuer une action personnalisée sur chaque script shell trouvé, vous pouvez le faire avec un autre -exec
à la place des -print
dans les find
commandes ci-dessus, mais il serait également possible de le 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 {} +
En relation:
--filetype
option pour la commande find ou toute autre chose qui vous indiquera le type de fichier. La seule chose que vous pouvez faire est d'utiliser--exec file {} \;
puis de le dirigergrep Bourne
si vous recherchez des scripts bash ougrep Perl
si vous recherchez des scripts Perl ou quelque chose du genre.