6 votes

Finder/Terminal : Trouver les fichiers qui contiennent moins de 21 lignes de texte

J'ai beaucoup de fichiers texte qui contiennent un nombre différent de lignes de texte.

Dans le Finder de Mac OS, existe-t-il un moyen de rechercher des fichiers de moins de 21 lignes (c'est-à-dire que chaque fichier contient moins de 21 lignes de texte) ?

La recherche de fichiers propose de nombreuses options, mais je n'en vois aucune qui concerne la longueur des lignes.

D'après ce que j'ai lu sur le sujet, il semble que l'utilisation de Grep dans Terminal soit la meilleure solution, mais je n'ai trouvé aucune source expliquant comment utiliser Grep pour rechercher la longueur des lignes sur plusieurs fichiers.

12voto

nohillside Points 82672

Dans le terminal, vous pouvez combiner find y wc pour ça :

find /path/to/directory -type f \
    -exec bash -c '[[ $(wc -l < "$1") -lt 21 ]]' _ {} \; -print

Ceci trouvera tous les fichiers ( -type f ) en dessous /path/to/directory , comptez les lignes ( wc -l < "{}" , {} est remplacé par tout fichier trouvé) et affiche le nom du fichier pour les fichiers contenant moins de 21 lignes.

PS : Il essaiera également de compter les lignes dans les fichiers non textuels. Si cela pose des problèmes, utilisez ce qui suit à la place :

find /path/to/directory -type f -exec bash -c 'file -b "$1" | grep -q text' _ {} \; \
    -exec bash -c '[[ $(wc -l < "$1") -lt 21 ]]' _ {} \; -print

PPS : Pour commencer de le répertoire courant, remplacez le chemin au début par . (un seul point, pour le répertoire courant)

PPPS : Pour restreindre la recherche à le répertoire courant, utilisez find . -maxdepth 1 -type f ...

5voto

Michael Zhou Points 167

Voici une autre solution de coquille. Nous partons du répertoire de travail actuel . -

find . -type f -exec wc -l {} + | sed '$d'| awk '$1 < 21 { $1=""; print}'

find les filtres ne font que classer et exécuter wc pour tous les fichiers trouvés. La sortie est envoyée à sed où on enlève la dernière ligne qui serait quelque chose comme ### Total .

awk traite ensuite chaque ligne de sortie pour que la première colonne soit inférieure à 21 lignes et imprime le nom du fichier dans la colonne 2 de la sortie sur wards.

2voto

Je ne vais pas faire du "code golf" (le plus court gagne) C'est plus comme un "code basket".

Parce que vos besoins sont un peu complexes, je vous conseille d'utiliser le plus accordable option.

Nous lançons avec

 Find (root directory) -type f | perl count21

Count21 est un fichier qui contient du perl.

 while (<>) {           # read each line of input into variable $_
   chomp $_;               # Removing newline at end of line, if exists. It does.

   local $/ = undef;    # Input will ignore newlines and slurp in entire file 
   open (my $IN, "<", $_);    # immune to < > ' " tab etc. in filename
   my $text = <$IN>;          # read entire file
   chomp $text;               # remove last newline if exists, so files with or 
                              # without trailing newlines are the same.

   $lc = ( $text =~ tr/\n// ) + 1;  # tr/\n// counts newline characters. 
                                    # $text =~ says apply this operation to $text. 
                                    # The value of this operation is char count.
                                    # Add 1 so we count the last line.
                                    # This count will be wrong on 0-line files,
                                    # but that's outside of problem scope. 

   if (21 >= $lc) {                 # if $lc <= 21 (Putting var first is bad luck) 
      print $_, "\n";               # print filename, and a newline
   }      # endif

} # end while(<>)

S'embêter avec tout ce perl et éviter tous les raccourcis semble super stupide . La raison de le faire est vous pouvez faire face beaucoup plus facilement aux rides inattendues comme le problème "certaines lignes ne se terminent pas par une nouvelle ligne", facilement résolu avec un chomp et un +1 ici.

Cela élimine également le problème que vous auriez avec le passage de listes de fichiers en shell, comme les noms de fichiers avec espaces , ", ', |, onglet et autres clés à molette. Malheureusement, la tuyauterie de Find ne supportera pas nouvelle ligne dans un nom de fichier, mais le module Perl File::Find le fera.

Il est également facile d'ajouter encore plus de choses : par exemple, si vous ne voulez que les fichiers avec "diddle", ajoutez

 next if not ( $text =~ /diddle/i );

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X