I've nearly reached my limit for the permitted number of files in my Linux home directory, and I'm curious about where all the files are.
In any directory I can use for example find . -type f | wc -l
to show a count of how many files are in that directory and in its subdirectories, but what I'd like is to be able to generate a complete list of all subdirectories (and sub-subdirectories etc) each with a count of all files contained in it and its subdirectories - if possible ranked by count, descending.
Eg if my file structure looks like this:
Home/
file1.txt
file2.txt
Docs/
file3.txt
Notes/
file4.txt
file5.txt
Queries/
file6.txt
Photos/
file7.jpg
The output would be something like this:
7 Home
4 Home/Docs
2 Home/Docs/Notes
1 Home/Docs/Queries
1 Home/Photos
Any suggestions greatly appreciated. (Also a quick explanation of the answer, so I can learn from this!). Thanks.
Right-click on the folder and select the “Properties” option. The “Properties” window will open and you will be able to see the number of files and subdirectories located in the directory selected.
The ls command is used to list files or directories in Linux and other Unix-based operating systems. Just like you navigate in your File explorer or Finder with a GUI, the ls command allows you to list all files or directories in the current directory by default, and further interact with them via the command line.
Browse to the folder containing the files you want to count. Highlight one of the files in that folder and press the keyboard shortcut Ctrl + A to highlight all files and folders in that folder. In the Explorer status bar, you'll see how many files and folders are highlighted, as shown in the picture below.
Use the ls command to display the contents of a directory. The ls command writes to standard output the contents of each specified Directory or the name of each specified File, along with any other information you ask for with the flags.
I use the following command
find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
Which produces something like:
[root@ip-***-***-***-*** /]# find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
1 .autofsck
1 stat-nginx-access
1 stat-nginx-error
2 tmp
14 boot
88 bin
163 sbin
291 lib64
597 etc
841 opt
1169 root
2900 lib
7634 home
42479 usr
80964 var
This should work:
find ~ -type d -exec sh -c "fc=\$(find '{}' -type f | wc -l); echo -e \"\$fc\t{}\"" \; | sort -nr
Explanation: In the command above will run "find ~ -type d" to find all the sub-directories the home-directory. For each of them, it runs a short shell script that finds the total number of files in that sub-directory (using the "find $dir -type f | wc -l" command that you already know), and will echo the number followed by the directory name. The sort command then runs to sort by the total number of files, in a descending order.
This is not the most efficient solution (you end up scanning the same directory many times), but I am not sure you can do much better with a one liner :-)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With