Question

Je dois écrire un script qui trouve tous les fichiers exécutables dans un répertoire. J'ai donc essayé plusieurs façons de mettre en œuvre et ils fonctionnent réellement. Mais je me demande s'il y a une façon plus agréable de le faire.

Alors ce fut ma première approche:

ls -Fla | grep \*$

Cela fonctionne très bien, parce que le drapeau -F fait le travail pour moi et ajoute à chaque fichier exécutable d'un astérisque, mais disons que je ne suis pas comme le signe astérisque.

C'était donc la deuxième approche:

ls -la | grep -E ^-.{2}x 

Cela fonctionne trop bien, je veux un tiret comme premier caractère, alors je ne suis pas intéressé par les deux personnages et le quatrième caractère doit être un x.

Mais il y a un peu d'ambiguïté dans les exigences, parce que je ne sais pas si je dois vérifier pour l'utilisateur, groupe ou autre autorisation exécutable. Donc, cela fonctionnerait:

ls -la | grep -E ^-.{2}x\|^-.{5}x\|^-.{8}x

Alors je teste la quatrième, septième et dixième caractère à un x.

Maintenant, ma vraie question, est-il une meilleure solution en utilisant ls et grep avec regex pour dire:

Je veux grep uniquement les fichiers, ayant au moins un x dans les dix premiers caractères d'une ligne produits par ls -la

Était-ce utile?

La solution

Avez-vous besoin d'utiliser ls? Vous pouvez utiliser FIND pour faire la même chose:

find . -maxdepth 1 -perm -111 -type f

retournera tous les fichiers exécutables dans le répertoire courant. Retirez le drapeau -maxdepth pour parcourir tous les répertoires enfants.

Vous pouvez essayer cette terribleness mais il pourrait correspondre à des fichiers qui contiennent des chaînes qui ressemblent à des autorisations.

ls -lsa | grep -E "[d\-](([rw\-]{2})x){1,3}"

Autres conseils

Si vous devez absolument utiliser ls et grep, cela fonctionne:

ls -Fla | grep '^\S*x\S*'

Il correspond à des lignes dont le premier mot (non-blanc) contient au moins un 'x'.

Find est l'outil parfait pour cela. Ceci trouve tous les fichiers (-type f) qui sont exécutables:

find . -type f -executable

Si vous ne voulez pas à la liste récursive tous les exécutables, utilisez maxdepth:

find . -maxdepth 1 -type f -executable

Peut-être avec le test -x?

for f in $(\ls) ; do test -x $f && echo $f ; done

\ sur ls alias shell by-pass.

for i in `ls -l | awk '{ if ( $1 ~ /x/ ) {print $NF}}'`; do echo `pwd`/$i; done

Cela donne des chemins absolus aux executables.

file * |grep "ELF 32-bit LSB executable"|awk '{print $1}'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top