7 votes

Bash : Trouver les dossiers contenant moins de x fichiers

Comment puis-je trouver tous les dossiers d'un répertoire qui contiennent moins de x nombre de .flac des fichiers ?

9voto

  • Pour chaque sous-répertoire, imprimez le nom du sous-répertoire s'il y en a au plus 42. .flac dans le sous-répertoire. Pour exécuter une commande sur les répertoires, remplacez -print por -exec … \; . Conforme à POSIX.

    find . -type d -exec sh -c 'set -- "$0"/*.flac; [ $# -le 42 ]' {} \; -print

    Notez que cette commande ne fonctionnera pas pour rechercher des répertoires contenant zéro .flac fichiers ( "$0/*.flac" s'étend à au moins un mot). Au lieu de cela, utilisez

    find . -type d -exec sh -c 'set -- "$0"/*.flac; ! [ -e "$1" ]' {} \; -print
  • Même algorithme dans zsh. **/* s'étend à tous les fichiers du répertoire courant et de ses sous-répertoires de manière récursive. **/*(/) limite l'expansion aux répertoires. {.,**/*}(/) ajoute le répertoire courant. Enfin, (e:…:) restreint l'expansion aux correspondances pour lesquelles le code Shell renvoie 0.

    echo {.,**/*}(/e:'set -- $REPLY/*.flac(N); ((# <= 42))':)

    Pour plus de lisibilité, on peut le décomposer en deux étapes.

    few_flacs () { set -- $REPLY/*.flac(N); ((# <= 42)); }
    echo {.,**/*}(/+few_flacs)

<strong>Changelog </strong>:<br>- gérer x=0 correctement.<br>

2voto

cYrus Points 20338

Remplacer $MAX avec votre propre limite :

find -name '*.flac' -printf '%h\n' | sort | uniq -c | while read -r n d ; do [ $n -lt $MAX ] && printf '%s\n' "$d" ; done

Nota: Ceci imprimera tous les sous-répertoires avec un nombre de .flac les fichiers entre 0 y $MAX (tous deux exclus).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X