étant donné la structure suivante:
oz123@debian:~/ $ tree .
.
├── a
│ ├── a1
│ ├── a2
│ └── a3
├── a1
│ ├── a11
│ ├── a12
│ └── a31
├── b
│ └── b1
│ ├── b11
│ │ └── b21
│ │ └── b31
│ ├── b12
│ └── b3
└── c
16 directories, 0 files
Comment trouver tous les nœuds d'extrémité?
J'ai trouvé les solutions suivantes qui semblent être bonnes, mais je dois prouver qu'il n'y a pas de cas de test qui échouera.
La page d'aide des -links
états:
Vous pouvez également rechercher des fichiers qui ont un certain nombre de liens, avec '-links'. Les répertoires ont normalement au moins deux liens durs; leur . l'entrée est la deuxième. S'ils ont des sous-répertoires, chacun d'eux a également un lien dur appelé .. vers son répertoire parent. Le . et .. les entrées du répertoire ne sont normalement pas recherchées sauf si elles sont mentionnées sur la ligne de commande find.
solution possible:
oz123@debian:~/ $ find . -type d -links 2
./a/a2
./a/a3
./a/a1
./c
./a1/a31
./a1/a11
./a1/a12
./b/b1/b12
./b/b1/b3
./b/b1/b11/b21/b31
- Quelqu'un peut-il fournir une meilleure solution (sans utiliser de tuyaux et de sed, cela a été performant ...)
- Cela fonctionnera-t-il sur n'importe quel système de fichiers?
command-line
find
file-search
Oz123
la source
la source
-links 2
astuce. Cela ne fonctionnera pasbtrfs
.Réponses:
En complément de votre propre solution avec
-links
, je veux simplement ajouter que cela ne fonctionnera pas sur les systèmes de fichiers qui ne suivent pas la convention de lien de répertoire Unix. À partirman find
de l'option on,-noleaf
il s'agit au moins de CD-ROM, de systèmes de fichiers MS-DOS et de points de montage de volume AFS.Pour référence, cette question a déjà été discutée avec différentes solutions qui sont en effet plus lentes et recourent généralement à la tuyauterie à sed / awk et similaire.
la source
Il y a une option un peu plus évidente
-empty
:upd. Ok, vous avez raison, cela ne fonctionnera pas avec les fichiers dans les répertoires.
Voici donc une version non fiable du système de fichiers fixe:
la source
find . -type d -links 2
fonctionne sur la plupart des systèmes de fichiers, mais pas sur tous. Je ne pense pas qu'il existe un moyen de savoir autre que de savoir quels types de systèmes de fichiers ont la propriété que les répertoires contiennent un lien vers eux-mêmes. GNU find le détecte dynamiquement (s'il imprime quelque chose sur «Activer automatiquement l'option -noleaf de find», vous savez que votre système de fichiers n'a pas cette propriété). Les types de systèmes de fichiers les plus courants sont corrects, mais pas FAT ou btrfs.Si vous voulez en être sûr, vous devrez tester chaque répertoire. Une façon de procéder consiste à invoquer à
find
nouveau pour chaque sous-répertoire.(avec GNU
find
, vous pouvez le remplacer-prune
par-print -quit
pour le rendre un peu plus efficace).Une autre façon consiste à post-traiter la sortie de
find
. Avecfind -depth
, un répertoire feuille est un répertoire qui ne suit pas un sous-répertoire de lui-même.la source
Essayez la solution suivante (doit être compatible Linux, Unix et OS X):
C'est une approche similaire à la solution urgente , mais sans aucun tuyau.
la source