|
From: | Kerin Millar |
Subject: | Re: Sorting directories by size |
Date: | Tue, 24 Aug 2021 15:05:07 +0100 |
User-agent: | Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.13.0 |
On 24/08/2021 14:46, hancooper wrote:
‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐ On Tuesday, August 24, 2021 1:35 PM, hancooper <hancooper@protonmail.com> wrote:‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐ On Tuesday, August 24, 2021 12:52 PM, Alex fxmbsw7 Ratchev fxmbsw7@gmail.com wrote:i guess you didnt set $dir On Tue, Aug 24, 2021, 14:12 hancooper hancooper@protonmail.com wrote:‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐ On Tuesday, August 24, 2021 3:31 AM, Kerin Millar kfm@plushkava.net wrote:On Tue, 24 Aug 2021 02:21:28 +0000 hancooper via help-bash@gnu.org wrote:I have a directory stored in `dir`. I want to store the names of directories at a particular leveland sort them by size. I have started with listing the directory names in `dlc` and computing the total number ofdirectories present. But still have to sort `dlc` by size, the with the biggest first.My initial plan is to use a command such as `du -h | sort -h`. daggr=( -mindepth "$depth" -maxdepth "$depth" ) dlc=$( find "$dir" "${daggr[@]}" -type d | tr "\n" " " ) ndr=$( echo "$dlc;" | grep -o " " | wc -l )The last two of these three commands should be jettisoned. Further, you ought to be using an array to store the directory names. As you appear to be using GNU, consider the following. daggr=(-mindepth "$depth" -maxdepth "$depth") mapfile -td '' dlc < <(find "$dir" "${daggr[@]}" -type d -exec du -0 {}- | sort -zrn | cut -z -f2-)ndr=${#dlc[@]} This relies on the fact that GNU du(1), given the -0 option, employs an output format of "%d\t%s\0", <size>, <pathname>. ---------------------------------------------------------------------------------------------------------------------------------------- Kerin MillarI agree with your assessment. Have seen that I get the following errer find: ‘’: No such file or directoryI would like to have the capability to print the directories with their size, in the form of a table (size dir).Have used the following sdr=$( find "$src" "${daggr[@]}" -type d -exec du {} + \ | sort -zrn ) echo "$sdr"
That's not what I wrote. The above is broken in multiple ways. Not least, because du(1) no longer uses NUL as a line delimiter.
I am suspicious of the sorted results because I get bash: warning: command substitution: ignored null byte in input 17844 ./01cuneus/articles/detailed/advoc/privasec--2018/privasec--2018--files 18636 ./01cuneus/articles/detailed/advoc/privasec--2018 40812 ./01cuneus/articles/detailed/advoc/eucd 59452 ./01cuneus/articles/detailed/advoc 4 ./01cuneus/articles/detailed/infocs/geoinforma/2018--gsdcoll--esc/gsdcoll--esc--files 34584 ./01cuneus/articles/detailed/infocs/geoinforma/2018--gsdcoll--esc 35460 ./01cuneus/articles/detailed/infocs/geoinforma 272 ./01cuneus/articles/detailed/infocs/informatic--files/tempora 8348 ./01cuneus/articles/detailed/infocs/informatic--files 132 ./01cuneus/articles/detailed/infocs/ntwrk--survl 43944 ./01cuneus/articles/detailed/infocs 4 ./01cuneus/articles/short/advoc/opendm/2019/q2 8 ./01cuneus/articles/short/advoc/opendm/2019 12 ./01cuneus/articles/short/advoc/opendm
As above.
Finally, the display of the sorted list should show the size in human readable form.
So you're happy for the output lines of du(1) to be stored by an array, as opposed to just the pathnames? Very well.
mapfile -td '' dlc < <(find "$dir" "${daggr[@]}" -type d -exec du -h0 {} + | sort -zrh)
-- Kerin Millar
[Prev in Thread] | Current Thread | [Next in Thread] |