Je souhaite effectuer une recherche récursive dans une arborescence de répertoires et répertorier le nombre de fichiers disponibles dans chaque dossier dont le nom correspond à une chaîne donnée. En effet, je souhaite renvoyer les résultats de :
ls -l | wc -l
pour chaque dossier que j'ai identifié via find
.
Code
Le code ci-dessous répertorie correctement le nombre de fichiers dans chaque dossier dont le nom contient Magic Data chaîne.
find /path/to/cool/stuff
-maxdepth 4
-type d
-name '*Magic Data*'
-print0 | xargs
--verbose
-0 -I {} ls -l {}
Je voudrais le développer et diriger les résultats de ls
à wc -l
.
Essayer
find /path/to/cool/stuff
-maxdepth 4
-type d
-name '*Magic Data*'
-print0 | xargs
--verbose
-0 -I {} ls -l {} | wc -l
Cela échoue et imprime :
ls -l /path/to/cool/stuff/some/folders/Magic Data
ls -l /path/to/cool/stuff/some/folders2/Magic Data
Sortie souhaitée
/path/to/cool/stuff/some/folders/Magic Data 29
/path/to/cool/stuff/some/folders2/Magic Data 30
La sortie souhaitée contiendrait :
- Chemin complet du dossier recherché
- Sortie de
wc -l
, qui dans ce cas reflète le nombre de fichiers non cachés
Réponse acceptée :
Il existe deux façons principales de résoudre ce problème :
-
Modifier le
find
commande afin qu'elle n'entre que dans les répertoires qui vous intéressent, puis imprime un seul caractère (par exemple,x
) pour chaque fichier trouvé à l'intérieur. Comptez ensuite le nombre de ce caractère produit avecwc -l
. Il est plus sûr de sortir un caractère que le nom de chemin car les noms de chemin sous Unix peuvent potentiellement contenir des retours à la ligne. Cette solution est un peu délicate car elle implique l'utilisation de-prune
pour ignorer les répertoires qui ne nous intéressent pas, ou alternativement! -path
. -
Trouvez les répertoires comme vous l'avez fait jusqu'à présent, mais utilisez ensuite un script en ligne pour compter les fichiers qu'ils contiennent. C'est plus simple, et ce que je montre ci-dessous.
find /path/to/cool/stuff -maxdepth 4 -type d -name "*Magic Data*'
-exec bash -O dotglob -c '
dir=$1
set -- "$dir"/*
printf "%s %dn" "$dir" "$#"' bash {} ';'
Ici, on retrouve les répertoires comme vous le faites, puis, pour chaque répertoire, on lance ce court bash
script :
dir=$1
set -- "$dir"/*
printf "%s %dn" "$dir" "$#"
Cela prend le chemin du répertoire de la ligne de commande (donné par find
), et développe le *
motif glob en son sein. En définissant le dotglob
option shell sur la ligne de commande du script, nous sommes assurés de compter également les fichiers et répertoires cachés (supprimez -O dotglob
pour ne pas compter les noms masqués).
Nous faisons l'expansion de tous les noms en tant qu'argument de set
, qui définira les paramètres de position sur les entrées développées. Le nombre de paramètres positionnels est disponible sous la forme $#
, qui est donc également le nombre de fichiers dans ce répertoire particulier.
Connexe :
- Comprendre l'option -exec de `find`