When displaying directories in Linux using ls -ld, I get something like this:
<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="92e7e1f7e0d2e1faf7fefe">[email protected]</a>:~/somedirectory$ ls -ld drwxr-xr-x 2014 K-rock users 65536 20011-11-05 11:34 <a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1f6a6c7a6d5f6c777a7373">[email protected]</a>:~/somedirectory$
How would I find the number of subdirectories and files in the somedirectory using the result above? From what I understand, the number of links corresponds to the number of subdirectories, but what about the number of files? How would I read the result of the ls -ld to find those numbers?
Also, this is an assignment and I have to say the number of files and subdir that are in somedirectory using the result shown above. So I can’t really use any other code unfortunately.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Since, you want to decipher from the output that you have got, we will try and simplify things.
ls -ld drwxr-xr-x 4 root root 4096 Nov 11 14:29 .
Now, ls -ld on a directory gives me the output as above. Now, the number 4 is something that you need to concentrate on. The 4 corresponds to:
- the entry for that directory in its parent directory;
- the directory’s own entry for
.; - the
..entries in the 2 sub-directories inside the directory.
To verify this, if I just issue ls I could see that I have couple of more directories. So, this gives an idea of what we could decipher from the output of your case.
drwxr-xr-x 2014 K-rock users 65536 20011-11-05 11:34
There are 2012 sub-directories inside which is why you get 2014 in the output.
As to the number of files, it is not possible to find it out from the output that you have.
To test if my theory is correct, I did the below testing.
ls -la | grep -E '[d]' #Display only directories drwxr-xr-x 12 root root 4096 Nov 11 14:42 . drwxr-xr-x 4 root root 4096 Nov 11 14:20 .. drwxr-xr-x 3 root root 4096 Nov 11 14:45 hello1 drwxr-xr-x 2 root root 4096 Nov 11 14:42 hello2 drwxr-xr-x 2 root root 4096 Nov 11 14:42 hello3 drwxr-xr-x 2 root root 4096 Nov 11 14:42 hello4 drwxr-xr-x 2 root root 4096 Nov 11 14:42 hello5 drwxr-xr-x 2 root root 4096 Nov 11 14:42 hello6 drwxr-xr-x 2 root root 4096 Nov 11 14:42 hello7 drwxr-xr-x 2 root root 4096 Nov 11 14:42 hello8 drwxr-xr-x 2 root root 4096 Nov 11 14:21 hello-subdir drwxr-xr-x 2 root root 4096 Nov 11 14:29 spaced hello
Now, I issue ls -ld command and the output I get is,
ls -ld drwxr-xr-x 12 root root 4096 Nov 11 14:42 .
It did not take into consideration the files or subdirectories nested inside the subdirectories of the folder. Basically, the above command says I have 10 directories inside my folder.
P.S.: It is often a bad idea to parse something from ls output as it is not reliable. Use find with -maxdepth instead if you have a chance to use it.
Method 2
If you can use ls, then I assume you can use builtin bash functionality too.
Using pure bash to count all entries in the current directory:
$ num_entries () ( # Define a function to:
> shopt -s nullglob # expand * to empty string if no files
> shopt -s dotglob # include .files in * expansion
> a=( * ) # create array containing all entries in current directory
> echo ${#a[@]} # display length of array (number of directory entries)
> )
$ num_entries # call function for current directory
467
$
Using pure bash to count all subdirectories in the current directory:
$ num_dirs () (
> shopt -s nullglob
> shopt -s dotglob
> a=( */ ) # note the */ glob which selects only directories
> echo ${#a[@]}
> )
I put these in ( ) function bodies so the shopt settings would only have effect within that function and have no other side effects.
Method 3
In a simple case this works:
ls -A1 | wc -l
Method 4
You may combine a couple of approaches
-
Number of files in a directory
ls -l | grep "^-" | wc -l
-
Walk through subdirectories
find ./subdirectory -type d
-
put together in one command
find ./subdirectory -type d | xargs -I{} sh -c "ls -l {} | grep -c '^-'"
Will recursively result a count of files restisting in the directories.
Of course there a multiple ways to prettify or enrich the output.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0