linux - Using find and wc -L to find files containing lines longer then 500 characters

07
2014-07
  • Nathan Clark

    I have this command:

    find . -name "*.php"  -exec wc -L '{}' \; 
    

    And I believe it gives me the count of the longest line for each file. But I'm looking for a way to only print out the count and file location if the length is greater the 500.

    Has anyone done this before?

  • Answers
  • lesmana

    here is a crude script which does what you want

    find . -name "*.php"  -exec wc -L '{}' \; |
      while read maxlinelength filename
      do
        if [ 500 -lt $maxlinelength ]
        then
          echo $maxlinelength $filename
        fi
      done
    

    the output of the find-wc combination is piped to a while read loop which puts each line of maxlinelength and filename in the variables $maxlinelength and $filename. the if then checks whether 500 is less than $maxlinelength and if it is prints the values.


  • Related Question

    linux - Bash: Find folders with less than x files
  • Leda

    How would I go about finding all the folders in a directory than contain less than x number of .flac files?


  • Related Answers
  • Gilles
    • For every subdirectory, print the subdirectory name if there are at most 42 .flac files in the subdirectory. To execute a command on the directories, replace -print by -exec … \;. POSIX compliant.

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

      Note that this command won't work to search for directories containing zero .flac files ("$0/*.flac" expands to at least one word). Instead, use

      find . -type d -exec sh -c 'set -- "$0"/*.flac; ! [ -e "$1" ]' {} \; -print
      
    • Same algorithm in zsh. **/* expands to all the files in the current directory and its subdirectories recursively. **/*(/) restricts the expansion to directories. {.,**/*}(/) adds the current directory. Finally, (e:…:) restricts the expansion to the matches for which the shell code returns 0.

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

      This can be broken down in two steps for legibility.

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

    Changelog:
    ​• handle x=0 correctly.

  • cYrus

    Replace $MAX with your own limit:

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

    Note: This will print all the subdirectories with a number of .flac files between 0 and $MAX (both excluded).