2010-03-25 5 views
1

Je veux boucler une série de fichiers dans un répertoire par lots, puis quitter lorsque le répertoire est vide.Comment quitter une boucle de bash en utilisant ls?

Au travail de $ « myprog » est en fait un programme qui traite (et archives) courrier électronique entrant dans un Maildir par lots de 100.

Je suis après quelque chose de simple que je peux mettre en Cron.

#!/bin/bash 

# Setup 
mkdir -p foo && touch foo/file_{1,2,3,4}.txt 
alias myprog='f=`ls foo/file_*.txt | head -n1`; rm -v $f' 

# Loop and then exit ?! 
# This line to go into cron. 
while (ls foo); do ls foo/ | wc -l; myprog; sleep 1; done 

Des idées?

+0

Vous pouvez faire des plages dans l'expansion de l'accolade: '{1..4}' –

+0

Et encore mieux, vous pouvez être PORTATIF et utiliser la globalisation appropriée 'file_ [1234]'. :) – vladr

Répondre

2

Je suppose que vous pouvez faire:

#!/bin/bash 
# ... 
while (ls foo/* &> /dev/null); do myprog; sleep 1; done 

Si rien ne correspond à foo/* (si aucun fichier dans le répertoire sont visibles foo), ls échouera. &>/dev/null conserve ls quiet.

+0

C'était rapide! Il me semble étrange que 'ls foo' revienne vrai mais' ls foo/* 'échouera - mais maintenant je sais! J'ai ajouté un 'ls foo/| wc -l; 'dans la boucle while pour voir les éléments diminuer. – CoffeeMonster

+1

Le sous-shell n'est pas nécessaire dans l'instruction 'while'. –