Domanda

I want to count all $ characters in each file in a directory with several subdirectories. My goal is to count all variables in a PHP project. The files have the suffix .php.

I tried

grep -r '$' . | wc -c
grep -r '$' . | wc -l

and a lot of other stuff but all returned a number that can not match. In my example file are only four $. So I hope someone can help me.

EDIT

My example file

<?php
class MyClass extends Controller {

$a;$a;
$a;$a;
$a;
$a;
È stato utile?

Soluzione

To recursively count the number of $ characters in a set of files in a directory you could do:

fgrep -Rho '$' some_dir | wc -l

To include only files of extension .php in the recursion you could instead use:

fgrep -Rho --include='*.php' '$' some_dir | wc -l

The -R is for recursively traversing the files in some_dir and the -o is for matching part of the each line searched. The set of files are restricted to the pattern *.php and file names are not included in the output with -h, which may otherwise have caused false positives.

Altri suggerimenti

For counting variables in a PHP project you can use the variable regex defined here.

So, the next will grep all variables for each file:

cd ~/my/php/project
grep -Pro '\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*' .

-P - use perlish regex
-r - recursive
-o - each match on separate line

will produce something like:

./elFinderVolumeLocalFileSystem.class.php:$path
./elFinderVolumeLocalFileSystem.class.php:$path
./elFinderVolumeMySQL.class.php:$driverId
./elFinderVolumeMySQL.class.php:$db
./elFinderVolumeMySQL.class.php:$tbf

You want count them, so you can use:

$ grep -Proc '\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*' .

and will get the count of variables in each file, like:

./connector.minimal.php:9
./connector.php:9
./elFinder.class.php:437
./elFinderConnector.class.php:46
./elFinderVolumeDriver.class.php:1343
./elFinderVolumeFTP.class.php:577
./elFinderVolumeFTPIIS.class.php:63
./elFinderVolumeLocalFileSystem.class.php:279
./elFinderVolumeMySQL.class.php:335
./mime.types:0
./MySQLStorage.sql:0

When want count by file and by variable, you can use:

$ grep -Pro '\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*' . | sort | uniq -c

for getting result like:

  17 ./elFinderVolumeLocalFileSystem.class.php:$target
   8 ./elFinderVolumeLocalFileSystem.class.php:$targetDir
   3 ./elFinderVolumeLocalFileSystem.class.php:$test
  97 ./elFinderVolumeLocalFileSystem.class.php:$this
   1 ./elFinderVolumeLocalFileSystem.class.php:$write
   6 ./elFinderVolumeMySQL.class.php:$arc
   3 ./elFinderVolumeMySQL.class.php:$bg
  10 ./elFinderVolumeMySQL.class.php:$content
   1 ./elFinderVolumeMySQL.class.php:$crop

where you can see, than the variable $write is used only once, so (maybe) it is useless.

You can also count per variable per whole project

$ grep -Proh '\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*' . | sort | uniq -c

and will get something like:

  13 $tree
   1 $treeDeep
   3 $trg
   3 $trgfp
  10 $ts
   6 $tstat
  35 $type

where you can see, than the $treeDeep is used only once in a whole project, so it is sure useless.

You can achieve many other combinations with different grep, sort and uniq commands..

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top