AdventOfCode2022/7
matthias@arch 4d037bad46 day 7
2022-12-08 01:46:51 +01:00
..
day7.sh day 7 2022-12-08 01:46:51 +01:00
output.txt day 7 2022-12-08 01:46:51 +01:00
README.md day 7 2022-12-08 01:46:51 +01:00

Day 7

🎁🎁🎁🎁🎁🎁🎁

Today's language: Bash + awk

The way the challenge is laid out is absolutely ridiculus; both tasks could be done in one-liners on a Linux machine in any POSIX shell, IF the user wasn't as stupid...

That's why I wrote a bash script that actually creates the whole filesystem from the input-file. It does so (by default) in /tmp. The sizes for the files are only allocated so that du shows the filesize, no write operations are taking place.

The problem is, that (even empty) directories have a size, which also increases with every file and subdirectory in it. That's why I needed to calculate the sizes of the directories without the actual file sizes and subtract that from the output of du. This new output can then be piped into an awk one-liner. In reality, this problem wouldn't exist since you would want the total size of a directory anyway.

If the size of the directories themselves would not matter, the commands would be:

# Task 1
du -b / | awk 'BEGIN{sum=0} {if ($1 <= 100000) {sum+=($1)}} END{print "Total size of all dirs<100000: "sum-0}'
# Task 2: min_size = (Update size) - (file system size) - (used size)
du -b / | awk 'BEGIN{file=""; size=99999999} {if ($1 >= min_size && $1 < size) {size=$1; file=$2}} END{print "You should delete "file" size("size")"}'
./day7.sh output.txt