linux - Using find and wc -L to find files containing lines longer then 500 characters
2014-07
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?
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.
How would I go about finding all the folders in a directory than contain less than x number of .flac
files?
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, usefind . -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.
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).