10

Ok this is strange. I am using this code,

ls *.prj

To list all the files with the .prj extension in the dir but I am getting this error,

bash: /bin/ls: Argument list too long

I eventually wish to get the count of files and I was using,

ls *.prj | wc -l

But even this command is giving the same error. Any idea where I am going wrong?

Sam007
  • 4,383

3 Answers3

11

Use find command instead

 find . -name "*.prj"

You can also combine the commands with find

find . -name "*.prj" -exec COMMAND {} \;

Hope this helps.

devav2
  • 36,312
9

Nothing, there is a limit on the number of argument bash can deal with. Do

ls | grep '\.prj$' | wc -l
January
  • 35,952
  • Yup that works great, that is what I wanted. Let this 15 min rule pass and I will select this as the right answer – Sam007 Nov 15 '12 at 20:27
3

Parsing the output of ls is unreliable. It will probably work in your case, but ls mangles unprintable characters. Here is a fully reliable way of counting the files matching a certain extension. This shell snippet creates an array containing the file names, then prints the number of elements in the array.

shopt -s nullglob
a=(*.prj)
echo ${#a[@]}
  • ok I tried this and echo is giving me value 17 but the actual value is 90419, which is correctly calculated by the other two commands above – Sam007 Nov 15 '12 at 21:46
  • 2
    @Sam007 Sorry, that was an error in my command, I used zsh syntax that gives a different result in bash. ${#a} in zsh calculates the length of the array, but in bash it gives the length of the first element, and you need ${#a[@]} to get the number of elements. – Gilles 'SO- stop being evil' Nov 15 '12 at 21:50
  • Yup that is working – Sam007 Nov 15 '12 at 22:00
  • Even if there is not a file with that extension, it outputs 1. And the list contains *prj – muyustan Mar 16 '20 at 05:45