1

Am wondering if someone can advise on the best way to do this. In my Web Dir is around 100 folders; each folder is a clientID.

Within each ClientID folder is a Sub-Set of folders. In each subset of folders is a set of structured folders that are the same.

Example:

httpdocs/client1234/amazon/
httpdocs/client1234/ebay/

Within the Folder of Amazon and Ebay we have a directory structure like:

In/
Out/
Backup/

What I am trying to do is scan the whole Web dir and locate In folders that have more than 50 files in the IN directory.

**edited Included in the IN Directory. Only interested in File count on the IN dir.

2
  • 2
    The In folder has directories that should be counted too? Commented Jan 5, 2016 at 14:33
  • If one of the 3 answers solves your problem, don't forget to accept it with the green check-mark. Thank you! Commented Jan 7, 2016 at 14:16

3 Answers 3

2

This one-liner should work:

find httpdocs -mindepth 2 -name In | xargs ls -1 | awk '$0 ~ /httpdocs.*In/{name=$0; start=NR} (NR-start)==50{print name;}'

It will first find all In directories, then list all its files, and, finally, filter those with more than 50 files.

Adjust -mindepth according to your start folder.

3
  • 1
    ls -1 will list the contents of directories if your find happens to discover one. Perhaps you want ls -1d or find ... -type f. But the whole thing will collapse if any of the filenames contains a space anyway. Commented Jan 5, 2016 at 15:16
  • I'm aware of that, I'm waiting OP to answer my comment... Commented Jan 5, 2016 at 15:31
  • This is a perfect solution, Sorry for the slow reply Filenames contain no spaces, This give me just what i was after. I was going to start filtering it down by file type, If you wanted to amend to include a filetype i.e. .xml Then that would be perfect. Its not required so if it cannot be done without re-writing then dont worry, But it would help when we have a server crash and am locatnig scripts that have not processed there IN Data. Commented Jan 13, 2016 at 17:05
2

This will loop through the requested directories, counting the files (and subdirectories' files) to see if there are more than 50 files; if so, it echoes the matching directory/directories:

for dir in httpdocs/*/*/In
do
  count=$(find $dir | wc -l)
  if [ $count -gt 50 ]
  then
    echo $dir has more than 50 files
  fi
done

Note I used strictly "greater-than" 50 because find's output includes that top-level "In" directory in its output to wc -l.

0
#!/bin/bash
 for dir in `find ./httpdocs/*/*/ -name In -type d` ; do
  count=`find $dir -type f | wc -l`
  if [[ $count -gt 50 ]]
     echo $dir
  fi
done

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.