Comment détecter de nouveaux fichiers dans un dossier avec un script bash ? Je souhaite traiter les fichiers dès qu'ils sont créés dans le dossier. Est-ce possible de le faire ou dois-je planifier un script avec cron qui recherche de nouveaux fichiers toutes les minutes environ?
shell
filesystems
files
directory
monitoring
ihatetorgister
la source
la source
Réponses:
Vous devriez envisager d'utiliser
inotifywait
, à titre d'exemple:Dans Ubuntu
inotifywait
est fourni par leinotify-tools
paquet. À partir de la version 3.13 (actuelle dans Ubuntu 12.04)inotifywait
, le nom du fichier ne sera pas inclus avec l'option -f. Les anciennes versions devront peut-être être contraintes. Il est important de noter que l’-e
option toinotifywait
est la meilleure façon de filtrer les événements. En outre, votreread
commande peut affecter la sortie de position à plusieurs variables que vous pouvez choisir d'utiliser ou d'ignorer. Il n'est pas nécessaire d'utiliser grep / sed / awk pour prétraiter la sortie.la source
inotifywait
était exactement ce que je voulais.The '--filename' option no longer exists. The option it enabled in earlier versions of inotifywait is now turned on by default.
Donc, il vous suffit de le faire,inotifywait -m /path -e create |
je vais essayer de modifier cette réponse.fswatch
. Je ne l'ai pas écrit, mais il est open source et je l'utilise.Je préfère
incron
, car c'est plus facile à gérer. Pour l’essentiel, c’est un service qui exploiteinotify
et vous pouvez configurer des configurations pour prendre des mesures en fonction des opérations de changement de fichier.Ex:
Vous pouvez voir un exemple complet ici: http://www.cyberciti.biz/faq/linux-inotify-examples-to-replicate-directories/
la source
Je viens de cuire cela, et je ne vois pas de gros problèmes, à part un risque minime de fichiers manquants entre les vérifications.
Si le traitement de votre fichier ne prend pas trop de temps, vous ne devez manquer aucun nouveau fichier. Vous pouvez également mettre en contexte les activités ... Ce n’est pas une solution à toute épreuve, mais cela sert à quelque chose sans outils externes comme inotify.
la source
inotify
n'est pas disponible. J'ajouterais-type f
pour filtrer les fichiers uniquement. Sinon, le dossier sera également renvoyé.-f filename
option est géniale. Alors, la seule question qui reste est de savoir comment faire en sorte que cela démarre au redémarrage. Je vais utiliser cela avec mon installation solaire pouros.system("ssh me@mysystem ' ( touch /home/me/alarms/low24 ) '")
que la création de ce fichier oblige l'ordinateur maître à utiliserespeak
et à annoncer la basse tension. Il m'envoie déjà un email mais comme mon système parle déjà l'heure en haut de l'heure, il a tout le reste. askubuntu.com/questions/977613/…Vous pouvez utiliser
watch
dans votre scriptSurveille votre dossier et répertorie tout ce qu'il contient toutes les 0,1 secondes
Inconvénient
N'est pas en temps réel, donc si un fichier était créé et supprimé en moins de 0,1 seconde, cela ne fonctionnerait pas,
watch
ne prend en charge qu'un minimum de 0,1 seconde.la source
Je suppose que le dossier cible (je l'appellerai
isempty
simplement pour plus de commodité) est vide et que vous attendez qu'un ou plusieurs fichiers y soient déposés.Vous pouvez utiliser la commande suivante:
juste pour vérifier si le dossier est toujours vide, en fait il retournera un 0 s'il n'y a pas de nouveau fichier (donc le
isempty
dossier est toujours vide) ou, au contraire, il retournera une valeur supérieure à 0 (en fait le nombre des fichiers actuellement dans le dossier).Cela dit, un test idiot si / alors peut faire le reste du travail:
Bien entendu, la
do_something
fonction devra manipuler le ou les fichiers duisempty
dossier, puis les supprimer du dossier après le traitement.Ajouter une ligne comme celle-ci dans votre crontab lancera le contrôle une fois par minute et déclenchera l'
do_something
action si le dossier n'est pas vide bien sûr:la source
ls
pour les scripts. Utilisezfind
ou un simple "globbing" à la place: mywiki.wooledge.org/ParsingLsSi vous souhaitez détecter de nouveaux fichiers, traitez-les puis, à la fin de la suppression des fichiers, vous pouvez utiliser systemd.path . Cette méthode repose sur inotify. Il existe une option DirectoryNotEmpty, afin que systemd puisse toujours exécuter votre script lorsqu'il détecte un fichier dans le répertoire. Vous devez vous rappeler que cela ne fonctionnera que si vous pouvez supprimer les fichiers traités et que le script laisse le répertoire vide.
Commencez par préparer le fichier mymonitor.service
Ensuite, allez dans mymonitor.path pour définir le chemin.
Si le nom du fichier .path est identique au nom du service, il n'est pas nécessaire de spécifier le nom du service dans le fichier .path.
Il repose sur la surveillance de l'accès aux fichiers pour les nuls
la source
entr
Utiliser
entr
est la nouvelle façon de faire (c'est multi-plateforme). Noteentr
n'utilise pas l'interrogation, ce qui lui confère un avantage considérable sur de nombreuses alternatives.Sur BSD, il utilise
pledge(2)
Vous pouvez l'installer avec
Vous pouvez suivre un répertoire pour les nouveaux ajouts en utilisant
Options expliquées (à partir de la documentation),
la source
Bash ne peut pas le faire facilement. Il vous faudrait essentiellement obtenir une liste de tous les fichiers du dossier, obtenir périodiquement une nouvelle liste et les comparer pour voir ce qui a changé.
Ce que vous recherchez s'appelle inotify. Il est intégré au noyau Linux et vous pouvez rester assis à attendre que quelque chose se passe. Inotify revient et dit: "Hé, il y a un nouveau fichier appelé foobar".
Pour accomplir ce que vous voulez, vous devez passer à quelque chose comme perl et utiliser Linux :: Inotify2 (python supporte probablement aussi inotify, mais je suis une personne de Perl).
la source
Cela fonctionne sous cygwin et Linux. Certaines des solutions précédentes qui écrivent un fichier vont provoquer le thrash du disque. Ce scipt n'a pas ce problème:
la source
Vous trouverez ci-dessous une version abrégée de l'exemple sur stackoverflow que j'ai testée et intégrée à l'un de mes projets nécessitant la surveillance de répertoires spécifiques.
Voici un lien vers un script qui utilise une version modifiée de celle-ci pour déchiffrer automatiquement les fichiers ou les répertoires situés dans son point de montage sshfs; le projet mentionné ci-dessus.
la source