Comment pourrais-je entrer dans la liste de tous les répertoires qui ne contiennent pas de fichier avec un nom de fichier donné? par exemple, étant donné cet arbre
/
/a
README
file001
file002
/b
README
file001
/c
file003
Je veux lister les répertoires qui n'ont pas de fichier nommé README
, dans ce cas ce serait le répertoire /c
. Comment ferais-je ça? Je ne peux penser à aucune syntaxe utilisant par exemple find
.
Réponses:
En supposant une
find
implémentation comme GNUfind
qui accepte une{}
intégration dans un argument pour-exec
:Exemple
Ici, les répertoires 1/1 à 5/5 ont un README, les autres répertoires sont vides.
Maintenant, lorsque nous exécutons cette version de notre
find
commande:Références
la source
Vous pouvez utiliser l'
-exec
option defind
vérifier le fichier, puis imprimer tous les résultats pour lesquels la vérification échoue.la source
Pas besoin de
find
. Utilisez simplement le shell:Si vous en avez besoin pour être récursif, vous pouvez utiliser (pour
bash
,zsh
peut le faire par défaut, utiliserset -o globstar
dansksh93
):(notez que les fichiers dot sont exclus par défaut).
la source
Avec
zsh
et qualificatifs glob (e
chaîne ):ou
ajouter
D
pour inclure des répertoires cachés:/
sélectionne uniquement les répertoires ete_'[[ ! -f $REPLY/README ]]'_
sélectionne uniquement les noms de répertoires pour lesquels le code shell entre les guillemets renvoietrue
, c'est-à-dire pour chaque nom de répertoire ($REPLY
) vers lequel le glob se*(/)
développe, il s'exécute[[ ! -f $REPLY/README ]]
et conserve le nom du répertoire si le résultat esttrue
.La deuxième forme
^e_'.....'_
utilise le même qualificatif glob, niée (mais cette fois l'expression conditionnelle n'est pas niée:)[[ -f $REPLY/README ]]
.Ce qui précède ne renverra que les noms de répertoire dans le répertoire actuel.
Si vous souhaitez effectuer une recherche récursive (encore une fois, pour inclure les répertoires masqués, ajoutez le
D
qualificatif):la source
De manière portable, vous pourriez faire:
[ -f file ]
teste si le fichier existe et est confirmé comme étant un fichier normal (après la résolution du lien symbolique).Si vous vouliez tester qu'il existe uniquement (en tant qu'entrée dans ce répertoire), quel que soit son type, vous auriez besoin de:,
[ -e file ] || [ -L file ]
mais notez que vous avez besoin d'une autorisation de recherche dans le répertoire pour effectuer ces tests. Vous voudrez peut-être ajouter des[ -x "$dir" ]
tests pour tenir compte des cas comme:Ou pour éviter les conditions de course, avec
zsh
:Voir aussi Comment savoir si un fichier standard n'existe pas dans Bash? sur SO.
la source