====== Chercher un fichier ou dossier ======
===== os.walk =====
import os, fnmatch
def locate(pattern, root=os.curdir):
'''Locate all files matching supplied filename pattern in and below
supplied root directory.'''
for path, dirs, files in os.walk(os.path.abspath(root)):
for filename in fnmatch.filter(files, pattern):
yield os.path.join(path, filename)
===== glob =====
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
===== os.scandir =====
C'est la méthode la plus performante (des builtins modules) en rapidité et en souplesse de code:
Exemple pour trouver les fichiers **suid** d'un répertoire avec **crossmount** activé ou désactivé (option **xdev** de la commande **find**) :
def find(path, crossmount=True):
dev = os.stat(path).st_dev
try:
for entry in os.scandir(path):
if entry.is_dir() and not entry.is_symlink():
if not crossmount and entry.stat().st_dev != dev:
continue
for result in find(entry.path, crossmount=crossmount):
yield result
yield entry
else:
yield entry
except OSError as e:
print(e, file=sys.stderr)
# Search suid files
for suid in (f.path for f in find('/home/gigix', crossmount=False) if f.is_file() and f.stat().st_mode & stat.S_ISUID == stat.S_ISUID)
print(suid)
Recherche les fichiers qui ont un **//setuid//** de positionné:
$ ./find.py
/home/gigix/Documents/VSCode-Anywhere/Third-Party/Junest/chroot/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/home/gigix/Documents/VSCode-Anywhere/Third-Party/Junest/chroot/usr/lib/polkit-1/polkit-agent-helper-1
/home/gigix/Documents/VSCode-Anywhere/Third-Party/Junest/chroot/usr/bin/mount
/home/gigix/Documents/VSCode-Anywhere/Third-Party/Junest/chroot/usr/bin/pkexec
/home/gigix/Documents/VSCode-Anywhere/Third-Party/Junest/chroot/usr/bin/chfn
/home/gigix/Documents/VSCode-Anywhere/Third-Party/Junest/chroot/usr/bin/ksu
/home/gigix/Documents/VSCode-Anywhere/Third-Party/Junest/chroot/usr/bin/umount
/home/gigix/Documents/VSCode-Anywhere/Third-Party/Junest/chroot/usr/bin/su
/home/gigix/Documents/VSCode-Anywhere/Third-Party/Junest/chroot/usr/bin/chsh
/home/gigix/Documents/VSCode-Anywhere/Third-Party/Junest/chroot/usr/bin/newgrp
===== os.listdir =====
C'est la méthode la moins performante:
def find_dirs(root_dir):
try:
for entry in os.listdir(root_dir):
entry_path = os.path.join(root_dir, entry)
if os.path.isdir(entry_path) and not os.path.islink(entry_path):
for result in find_dirs(entry_path):
yield result
else:
yield entry_path
except OSError as e:
print(e, file=sys.stderr)
===== faster-than-walk =====
C'est un module externe [[https://pypi.org/project/faster-than-walk/|faster-than-walk]] et est le plus rapide (plus que **os.scandir**).