cross-posted from: https://discuss.tchncs.de/post/13814482

I just noticed that eza can now display total disk space used by directories!

I think this is pretty cool. I wanted it for a long time.

There are other ways to get the information of course. But having it integrated with all the other options for listing directories is fab. eza has features like --git-awareness, --tree display, clickable --hyperlink, filetype --icons and other display, permissions, dates, ownerships, and other stuff. being able to mash everything together in any arbitrary way which is useful is handy. And of course you can --sort=size

docs:

  --total-size               show the size of a directory as the size of all
                             files and directories inside (unix only)

It also (optionally) color codes the information. Values measures in kb, mb, and gb are clear. Here is a screenshot to show that:

eza --long -h --total-size --sort=oldest --no-permissions --no-user

Of course it take a little while to load large directories so you will not want to use by default.

Looks like it was first implemented Oct 2023 with some fixes since then. (Changelog). PR #533 - feat: added recursive directory parser with `–total-size` flag by Xemptuous

  • some_guy@lemmy.sdf.org
    link
    fedilink
    arrow-up
    5
    ·
    edit-2
    7 months ago

    Off topic, but maybe someone will appreciate this. I wrote a function to get the size of contents of a dir a while back. It has a couple of dependencies (gc, gwc at a glance), but should be fairly portable. The results are sorted from greatest to least as shown in the screenshot.

    
    function szup() {
    
    description='
    #:    Title: szup
    #: Synopsis: sort all items within a directory according to size
    #:     Date: 2016-05-30
    #:  Version: 0.0.5
    #:  Options: -h | --help: print short usage info
    #:         : -v | --version: print version number
    '
    
    funcname=$(echo "$description" | grep '^#:    Title: ' | sed 's/#:    Title: //g')
    version=$(echo "$description" | grep '^#:  Version: ' | sed 's/#:  Version: //g')
    updated="$(echo "$description" | grep '^#:     Date: ' | sed 's/#:     Date: //g')"
    
    	function usage() {
    		printf "\n%s\n" "$funcname : $version : $updated"
    		printf "%s\n" ""
    	}
    
    	function sortdir() {
    		Chars="$(printf "    %s" "inspecting " "$(pwd)" | wc -c)"
    		divider=====================
    		divider=$divider$divider$divider$divider
    		format="    %-${Chars}.${Chars}s %35s\n"
    		totalwidth="$(ls -1 | /usr/local/bin/gwc -L)"
    		totalwidth=$(echo $totalwidth | grep -o [0-9]\\+)
    		Chars=$(echo $Chars | grep -o [0-9]\\+)
    		if [ "$totalwidth" -lt "$Chars" ]; then
    			longestvar="$Chars"
    		else
    			longestvar="$totalwidth"
    		fi
    		shortervar=$(/Users/danyoung/bin/qc "$longestvar"*.8)
    		shortervar=$(printf "%1.0f\n" "$shortervar")
    		echo "$shortervar"
    		printf "\n    %s\n" "inspecting $(pwd)"
    		printf "    %$shortervar.${longestvar}s\n" "$divider"
    		theOutput="$(du -hs "${theDir}"/* | gsort -hr)"
    		Condensed="$(echo -n "$theOutput" | awk '{ print $1","$2 }')"
    		unset arr
    		declare -a arr
    		arr=($(echo "$Condensed"))
    		Count="$(echo "$(printf "%s\n" "${arr[@]}")" | wc -l)"
    		Count=$((Count-1))
    		for i in $(seq 1 $Count); do
    		read var1 var2 <<< "$(printf "%s\n" "${arr[$i]}" | sed 's/,/ /g')"
    		printf "   %5s    %-16s\n" "$var1" "${var2//\/*\//./}"
    		done
    		echo
    	}
    
    	case "$1" in
    		-h|--help)
    			usage
    			return 0
    			;;
    		*)
    			:
    			;;
    	esac
    
         if [ -z "$1" ]; then
                 oldDir="$(pwd)"
                 cd "${1}"
                 local theDir="$(pwd)"
                 sortdir
                 cd "$oldDir"
                 return 0
         else
         		:
                 oldDir="$(pwd)"
                 cd "${1}"
                 local theDir="$(pwd)"
                 sortdir
                 cd "$oldDir"
                 return 0
         fi
    }```
    
    
    Screenshot isn't working. I'll reply to this with it.
      • some_guy@lemmy.sdf.org
        link
        fedilink
        arrow-up
        2
        ·
        7 months ago

        Hahaha. I may have spent a lot of time creating a script to implement functionality that was already there. du -hs * | sort -h -r, I guess.

    • linuxPIPEpower@discuss.tchncs.deOP
      link
      fedilink
      arrow-up
      2
      ·
      edit-2
      7 months ago

      Thanks! I always appreciate another tool for this. I tried to run it but have dep issues.

      What is gwc? I can’t find a package by that name nor is it included that I can see.

      Websearch finds GeoWebCache, Gnome Wave Cleaner, GtkWaveCleaner, several IT companies… nothing that looks relevant.

      edit: also stumped looking for gsort. it seems to be associated with something called STATA which is statistical analysis software. Is that something you are involved with maybe running some special stuff on your system?

      PS you missed a newline at the end before closing the code block which is why the image was showing up as markdown instead of displaying properly.

      Change:

          }```
      

      to:

          }
          ```
      
      • some_guy@lemmy.sdf.org
        link
        fedilink
        arrow-up
        2
        ·
        7 months ago

        Aha with the new line! Thank you!

        I believe gwc and gsort are part of coreutils based on this:

        $ gwc --help
        Usage: gwc [OPTION]... [FILE]...
          or:  gwc [OPTION]... --files0-from=F
        Print newline, word, and byte counts for each FILE, and a total line if
        more than one FILE is specified.  A word is a nonempty sequence of non white
        space delimited by white space characters or by start or end of input.
        
        With no FILE, or when FILE is -, read standard input.
        
        The options below may be used to select which counts are printed, always in
        the following order: newline, word, character, byte, maximum line length.
          -c, --bytes            print the byte counts
          -m, --chars            print the character counts
          -l, --lines            print the newline counts
              --files0-from=F    read input from the files specified by
                                   NUL-terminated names in file F;
                                   If F is - then read names from standard input
          -L, --max-line-length  print the maximum display width
          -w, --words            print the word counts
              --total=WHEN       when to print a line with total counts;
                                   WHEN can be: auto, always, only, never
              --help        display this help and exit
              --version     output version information and exit
        
        GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
        Full documentation <https://www.gnu.org/software/coreutils/wc>
        or available locally via: info '(coreutils) wc invocation'
        
  • rollingflower@lemmy.kde.social
    link
    fedilink
    arrow-up
    3
    ·
    7 months ago

    Awesome tool! If you use it with nerdfonts, you can have nice icons too!

    Note: it is not a 1:1 replacement for ls! Wait for uutils to be completed, and then start to use it.

  • t0m5k1@lemmy.world
    link
    fedilink
    English
    arrow-up
    7
    arrow-down
    8
    ·
    edit-2
    7 months ago

    Why does ls need a replacement?

    What does this do that ls cannot?

    Edit: cheers for the downvote for valid questions!! Guess the reddit mindset never leaves some.

    • linuxPIPEpower@discuss.tchncs.deOP
      link
      fedilink
      arrow-up
      13
      arrow-down
      1
      ·
      edit-2
      7 months ago

      aside from the subject of the post: the ones I miss when it’s not available are git status/ignoring, icons, tree, excellent color coding.

      Here I cloned the eza repo and made some random changes.

      eza --long -h --no-user --no-time --almost-all --git --sort=date --reverse --icons
      

      Made some more changes and then combine git and tree, something I find is super helpful for overview:

      eza --long -h --no-user --no-time --git --sort=date --reverse --icons --tree --level=2 --git-ignore --no-permissions --no-filesize
      

      (weird icons are my fault for not setting up fonts properly in the terminal.)

      Colors all over the place are an innovation that has enabled me to use the terminal really at all. I truly struggle when I need to use b&w or less colorful environments. I will almost always install eza on any device even something that needs to be lean. It’s not just pretty and splashy but it helps me correctly comprehend the information.

      I’d never want to get rid of ls and I don’t personally alias it to to eza because I always want to have unimpeded access to the standard tooling. But I appreciate having a few options to do the same task in slightly different ways. And it’s so nice to have all the options together in one application rather than needing a bunch of scripts and aliases and configurations. I don’t think it does anything that’s otherwise impossible but to get on with life it is helpful.

      • t0m5k1@lemmy.world
        link
        fedilink
        English
        arrow-up
        1
        arrow-down
        1
        ·
        7 months ago

        Not sure I could get with the huge string of arguments, That needs to be shortened to follow the ls style of stacking letters behind minimal “-”

        Does look good but I prefer function to form.

        Interesting though

        • linuxPIPEpower@discuss.tchncs.deOP
          link
          fedilink
          arrow-up
          1
          ·
          7 months ago

          oh of course there are abbreviated forms. I just used the long versions so that people who aren’t framiliar can follow what I am doing without having to spend 10 mins cross referencing the man page.

          Likewise in the examples I used options that created a fairly very simple screenshot to clearly illustrate an answer to the question of what eza does that ls doesn’t.

          I tend to use eza via a couple of aliases with sets of common preferences. Like in a git dir I want to sort by date. usually don’t need to see the user column, the size or permissions (except when I do). I do want to see the dotfiles. So I have an appropriate line as eg (eza git). A great companion to gs.

      • taladar@sh.itjust.works
        link
        fedilink
        arrow-up
        12
        ·
        7 months ago

        Not sure that really applies here since ls is usually a shell built-in so you can’t exactly uninstall it, not to mention all this feature creep probably means exa/eza has a much larger attack surface.

      • shirro@aussie.zone
        link
        fedilink
        English
        arrow-up
        4
        ·
        edit-2
        7 months ago

        Does it use safe development practices though? Or is mainstream Rust development npm leftpad all over again with developers dumpster diving for dependencies to make their lives easier and more productive.

        There is potentially a price to pay for colour ansi graphics and emoji and it comes in the form of a large tree of often trivial third party crates of unknown quality which could potentially contain harmful code. Is it all audited? Do I want it on a company server with customer data or even on a desktop with my own data?

        The various gnu and bsd core utils are maintained by their projects and are self contained without external dependencies and have history. There are projects rewriting unix core utils in Rust (uutils) that seem to be less frivolous which are more to my taste. Most traditional unix utils have very limited functionality and have been extensively analyzed over many years by both people and tools which offsets a lot of the deficiencies of the implementation language.

        • linuxPIPEpower@discuss.tchncs.deOP
          link
          fedilink
          arrow-up
          2
          ·
          7 months ago

          I am inclined to agree with you. See my comment in cross post of this thread.

          I’m just a home admin of my own local systems and while I try to avoid doing stuff that’s too wacky, in the context I don’t mind playing a bit fast n loose. If I screw it up, the consequences are my own.

          At work, I am an end user of systems with much higher grade of importance to lots of people. I would not be impressed to learn there was a bunch of novel bleeding edge stuff running on those systems. Administering them has a higher burden of care and responsibility and I expect the people in charge to apply more scrutiny. If it’s screwed up, the consequences are on a lot of people with no agency over the situation.

          Just like other things done at small vs large scale. Most people with long hair don’t wear a hairnet when cooking at home, although it is a requirement in some industrial food prep situations. Most home fridges don’t have strict rules about how to store different kinds of foods to avoid cross contamination, nor do they have a thermometer which is checked regularly and logged to show the food is being stored appropriately. Although this needs to be done in a professional context. Pressures, risks and consequences are different.

          To summarize: I certainly hope sysadmins aren’t on here installing every doohicky some dumbass like me suggests on their production systems. :D

      • snake_case_lover@lemmy.world
        link
        fedilink
        arrow-up
        9
        arrow-down
        10
        ·
        7 months ago

        there’s no such thing as safe language. People sent spaceships to moon with assembly. But there is one such thing as undereducated bootcamp grad developer.

        • taladar@sh.itjust.works
          link
          fedilink
          arrow-up
          15
          arrow-down
          1
          ·
          7 months ago

          We have tried the “sufficiently experienced and disciplined developer” approach for decades and it just doesn’t work.

        • t0m5k1@lemmy.world
          link
          fedilink
          English
          arrow-up
          1
          ·
          7 months ago

          True but when people speak of rust being safe they actually mean the way it deals with memory and that it is harder to arbitrability view the mem space it uses unlike C and it’s children.

  • some_guy@lemmy.sdf.org
    link
    fedilink
    arrow-up
    1
    arrow-down
    3
    ·
    7 months ago

    Off topic, but maybe someone will appreciate this. I wrote a function to get the size of contents of a dir a while back. It has a couple of dependencies (gc, gwc at a glance), but should be fairly portable (correct paths for your system). The results are sorted from greatest to least as shown in the screenshot. The purpose was to be able to see directory sizes, which is the topic of this post, so I figured I’d share.

    Hope it’s useful to someone. Free to modify as desired.

    
    function szup() {
    
    description='
    #:    Title: szup
    #: Synopsis: sort all items within a directory according to size
    #:     Date: 2016-05-30
    #:  Version: 0.0.5
    #:  Options: -h | --help: print short usage info
    #:         : -v | --version: print version number
    '
    
    funcname=$(echo "$description" | grep '^#:    Title: ' | sed 's/#:    Title: //g')
    version=$(echo "$description" | grep '^#:  Version: ' | sed 's/#:  Version: //g')
    updated="$(echo "$description" | grep '^#:     Date: ' | sed 's/#:     Date: //g')"
    
    	function usage() {
    		printf "\n%s\n" "$funcname : $version : $updated"
    		printf "%s\n" ""
    	}
    
    	function sortdir() {
    		Chars="$(printf "    %s" "inspecting " "$(pwd)" | wc -c)"
    		divider=====================
    		divider=$divider$divider$divider$divider
    		format="    %-${Chars}.${Chars}s %35s\n"
    		totalwidth="$(ls -1 | /usr/local/bin/gwc -L)"
    		totalwidth=$(echo $totalwidth | grep -o [0-9]\\+)
    		Chars=$(echo $Chars | grep -o [0-9]\\+)
    		if [ "$totalwidth" -lt "$Chars" ]; then
    			longestvar="$Chars"
    		else
    			longestvar="$totalwidth"
    		fi
    		shortervar=$(/Users/*********/bin/qc "$longestvar"*.8)
    		shortervar=$(printf "%1.0f\n" "$shortervar")
    		echo "$shortervar"
    		printf "\n    %s\n" "inspecting $(pwd)"
    		printf "    %$shortervar.${longestvar}s\n" "$divider"
    		theOutput="$(du -hs "${theDir}"/* | gsort -hr)"
    		Condensed="$(echo -n "$theOutput" | awk '{ print $1","$2 }')"
    		unset arr
    		declare -a arr
    		arr=($(echo "$Condensed"))
    		Count="$(echo "$(printf "%s\n" "${arr[@]}")" | wc -l)"
    		Count=$((Count-1))
    		for i in $(seq 1 $Count); do
    		read var1 var2 <<< "$(printf "%s\n" "${arr[$i]}" | sed 's/,/ /g')"
    		printf "   %5s    %-16s\n" "$var1" "${var2//\/*\//./}"
    		done
    		echo
    	}
    
    	case "$1" in
    		-h|--help)
    			usage
    			return 0
    			;;
    		*)
    			:
    			;;
    	esac
    
         if [ -z "$1" ]; then
                 oldDir="$(pwd)"
                 cd "${1}"
                 local theDir="$(pwd)"
                 sortdir
                 cd "$oldDir"
                 return 0
         else
         		:
                 oldDir="$(pwd)"
                 cd "${1}"
                 local theDir="$(pwd)"
                 sortdir
                 cd "$oldDir"
                 return 0
         fi
    }```
    
    
    ![](https://lemmy.sdf.org/pictrs/image/2a0578ce-1fd3-4e81-b9e7-41a57eb4d62a.png)