7

Is there a way to sum up the disk usage of a certain directory while in ftp? I was trying to create a script that will check what is the disk usage of the current directory and prints out the free space for the home directory.

Example:

ftp> cd /home/directory/
drw-rw-rw-   1 user     group           0 Nov 16 /directory
drw-rw-rw-   1 user     group           0 Nov 16 next/directory
drw-rw-rw-   1 user     group           0 Nov 16 next/next/directory

For some reason, I can't see any size for directories. But inside them were files that I need to check the usage, so I have to get something like this:

total disk usage for /home/directory = "some count"
total disk usage for /next/directory = "some count"
total disk usage for /../directory = "some count"

2 Answers 2

8

I suggest you to use curlftpfs to mount your FTP repository on your filesystem. Then use the traditional du -shc . command in the folder you want to know the disk usage.

2
  • This works only for ftp-directories which are readable. Directories which have "--x" permissions will not be "listable" by curlftpfs.
    – knb
    Nov 7, 2016 at 13:59
  • Yes! You can even use fileflight to get a nice visualization
    – Clément
    Dec 11, 2022 at 3:37
1

You could use Perl. From http://aplawrence.com/Unixart/perlnetftp.html:

#!/usr/bin/perl
my $param = $ARGV[0];
# required modules
 use Net::FTP;
 use File::Listing qw(parse_dir);

 sub getRecursiveDirListing
  {
      # create a new instance of the FTP connection
      my $ftp = Net::FTP->new("fftpserver", Debug=>0) or die("Cannot connect $!");
      # login to the server
      $ftp->login("username","password") or die("Login failed $!");

      # create an array to hold directories, it should be a local variable
      local @dirs = ();

      # directory parameter passed to the sub-routine
      my $dir = $_[0];

      # if the directory was passed onto the sub-routin, change the remote directory
      $ftp->cwd($dir) if($dir);

      # get the file listing
      @ls = $ftp->ls('-lR');

      # the current working directory on the remote server
      my $cur_dir = $ftp->pwd();

      my $totsize = 0;
      my $i = 0;
      my @arr = parse_dir(\@ls);
      my $arrcnt = scalar(@arr);
      if ($arrcnt == 0) {
        print "$cur_dir 0\n"; 
        $ftp->quit();
        exit 1;
      }
      else {
      # parse and loop through the directory listing
      foreach my $file (parse_dir(\@ls))
      {
          $i++;
          my($name, $type, $size, $mtime, $mode) = @$file; 
          $totsize = $totsize + $size if ($type eq 'f');

          print "$cur_dir $totsize\n" if ($i == $arrcnt);

          # recursive call to get the entries in the entry, and get an array of return values
#          @xx = getRecursiveDirListing ("$cur_dir/$name") if ($type eq 'd');
      }

      # close the FTP connection
      $ftp->quit();
      } 
      # merge the array returned from the recursive call with the current directory listing
#      return (@dirs,@xx);
  }
@y = getRecursiveDirListing ("$param");

To run it:

$ ./getSize.pl <directory>

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .