Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

savoir si un repertoire contient au moins un fichier (ksh, sun)

4 réponses
Avatar
octane
Bonjour

un script verifie la presence au minimum d'un fichier dans
un repertoire pour action.

Le script fourni contient:
if [ -f import/* ]
then
action
else
autre action
fi

Or, cela ne marche pas si le premier resultat renvoye par
l'expansion de * est un repertoire.

Je ne dois pas verifier l'existence de fichier dans des
sous-repertoires.

Je pensais verifier par un find du genre:
find import/ -type f -depth 1
mais je bute sur
-depth qui n'a pas l'effet esompte
-et la maniere d'encapsuler le find dans un test

Mais peut etre qu'il y a une solution simple a cote de
laquelle je suis passe (?)

Une idee?

Cordialement

4 réponses

Avatar
Stephane Chazelas
On 14 Apr 2006 06:24:52 -0700, wrote:
Bonjour

un script verifie la presence au minimum d'un fichier dans
un repertoire pour action.

Le script fourni contient:
if [ -f import/* ]
then
action
else
autre action
fi

Or, cela ne marche pas si le premier resultat renvoye par
l'expansion de * est un repertoire.

Je ne dois pas verifier l'existence de fichier dans des
sous-repertoires.

Je pensais verifier par un find du genre:
find import/ -type f -depth 1
mais je bute sur
-depth qui n'a pas l'effet esompte
[...]


l'effet esompté apres avoir lu la page de manuel?


-et la maniere d'encapsuler le find dans un test
[...]


has_file() { # args: <dir>
for f in "$dir"/* "$dir"/.*; do
[ -f "$f" ] && return 0
done
return 1
}

if has_file import; then
echo import has file'(s)'
fi

Ou

if find import/. ! -name . -prune -type f -print |
grep -q .; then
echo import had 'file(s)'
fi

Note que "[ -f" trouve les fichiers reguliers et les liens
symboliques vers les fichiers reguliers, "-type f" trouve les
fichiers reguliers uniquement. Tu peux avoir des resultats
inattendus si "[" ou "find" ne sont pas capable d'identifier le
type d'un fichier (par exemple pour des histoires de
permissions).

--
Stephane

Avatar
lhabert
:

Le script fourni contient:
if [ -f import/* ]
then
action
else
autre action
fi

Or, cela ne marche pas si le premier resultat renvoye par
l'expansion de * est un repertoire.


« -e » au lieu de « -f ». Mais je ne suis pas persuadé que ça soit garanti
de marcher, le test pourrait très bien raler que tu lui passes trop
d'arguments. Et en plus, tu ne vas pas récupérer les fichiers commençant par
« . ». Une solution serait plutôt :

PLOUM for f in import/* import/.[^.] import/.??*; do
if test -e "$f"; then PLOUM=t; break; done
done

if [ "$PLOUM" = t ]; then
action
else
autre action
fi

Avatar
lhabert
:

Le script fourni contient:
if [ -f import/* ]
then
action
else
autre action
fi

Or, cela ne marche pas si le premier resultat renvoye par
l'expansion de * est un repertoire.


« -e » au lieu de « -f ». Mais je ne suis pas persuadé que ça soit garanti
de marcher, le test pourrait très bien raler que tu lui passes trop
d'arguments. Et en plus, tu ne vas pas récupérer les fichiers commençant par
« . ». Une solution serait plutôt :

PLOUM for f in import/* import/.[^.] import/.?*; do
if test -e "$f"; then PLOUM=t; break; done
done

if [ "$PLOUM" = t ]; then
action
else
autre action
fi

Avatar
Stephane Chazelas
2006-04-14, 13:56(+00), Stephane Chazelas:
[...]
has_file() { # args: <dir>
for f in "$dir"/* "$dir"/.*; do


for f in "$1"/* "$1"/.*; do


sorry

[ -f "$f" ] && return 0
done
return 1
}

if has_file import; then
echo import has file'(s)'
fi

Ou

if find import/. ! -name . -prune -type f -print |
grep -q .; then
echo import had 'file(s)'
fi

Note que "[ -f" trouve les fichiers reguliers et les liens
symboliques vers les fichiers reguliers, "-type f" trouve les
fichiers reguliers uniquement. Tu peux avoir des resultats
inattendus si "[" ou "find" ne sont pas capable d'identifier le
type d'un fichier (par exemple pour des histoires de
permissions).




--
Stéphane