web-dev-qa-db-fra.com

Recherche de fichiers exécutables à l'aide de ls et grep

Je dois écrire un script qui trouve tous les fichiers exécutables dans un répertoire. J'ai donc essayé plusieurs façons de l'implémenter et elles fonctionnent réellement. Mais je me demande s'il y a une meilleure façon de le faire.

C'était donc ma première approche:

ls -Fla | grep \*$

Cela fonctionne bien, car l'indicateur -F fait le travail pour moi et ajoute à chaque fichier exécutable un astérisque, mais disons que je n'aime pas le signe astérisque.

C'était donc la deuxième approche:

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

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

Mais il y a un peu d'ambiguïté dans les exigences, car je ne sais pas si je dois vérifier l'utilisateur, le groupe ou toute autre autorisation exécutable. Cela fonctionnerait donc:

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

Je teste donc les quatrième, septième et dixième caractères pour être un x.

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

Je veux ne récupérer que ces fichiers, ayant au moins un x dans les dix premiers caractères d'une ligne produite par ls -la

28
k13n

Avez-vous besoin d'utiliser ls? Vous pouvez utiliser find pour faire de même:

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

renverra tous les fichiers exécutables dans le répertoire courant. Supprimez l'indicateur -maxdepth pour parcourir tous les répertoires enfants.

Vous pouvez essayer cette horreur, mais elle peut correspondre à des fichiers contenant des chaînes qui ressemblent à des autorisations.

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

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

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

Il correspond aux lignes où le premier mot (non blanc) contient au moins un "x".

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

find . -type f -executable

Si vous ne voulez pas qu'il répertorie récursivement tous les exécutables, utilisez maxdepth:

find . -maxdepth 1 -type f -executable
40
rmmh

Peut-être avec test -x?

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

Le\on ls contournera les alias de Shell.

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

Cela donne des chemins absolus vers les exécutables.

5
user842679