gardebring / PowerColorLS

PowerShell script to display a colorized directory and file listing with icons
MIT License
61 stars 3 forks source link

Ignore symlinks when calculating directory sizes #5

Open rashil2000 opened 3 years ago

rashil2000 commented 3 years ago

I noticed it's showing ~2x the size of a particular folder when compared to the Explorer's Properties dialog. Upon inspecting, I found out that the folder contained symlinks to some other folders.

The --show-directory-sizes flag should ideally ignore symlinked (soft linked) folders and should not recurse into them to add their size to the output.

rashil2000 commented 3 years ago

I think this seems to be a common problem with PS modules, as I had opened the same issue in this repository too about a month ago - gngrninja/PSFolderSize#20

gardebring commented 3 years ago

If you have time I welcome a contribution to fix this. Otherwise I will look into it when I have the time :)

rashil2000 commented 3 years ago

Upon some rudimentary research, I found that this line https://github.com/gardebring/PowerColorLS/blob/main/src/Private/FileAndFolderFunctions.ps1#L112 would require some object filtering in between the pipes; excluding directories that have the ReparsePoint attribute (source - https://stackoverflow.com/questions/817794/find-out-whether-a-file-is-a-symbolic-link-in-powershell).

Is this correct? Note that this might require additional checks for figuring out junctions/hardlinks too.

I have my uni exams, I'll definitely try to send a PR once they're done.

gardebring commented 3 years ago

Hi again @rashil2000 You are definitely at the right point in the code. I did however try to create a symlink setup that should create recursion but it seems the powershell code in fact did not do this.

rashil2000 commented 3 years ago

Yes, it seems like when we specify the ReparsePoint attribute, it just excludes those folders from listing but still recurses into them.

PowerShell 6+ doesn't follow symlinks by default, but provides a FollowSymlink flag in case we want to recurse into them.

However, for 5.1, we'll need to create a custom Get-ChildItem function, the one specified in this brilliant answer - https://stackoverflow.com/a/55544084

I tried using this and gives correct results for now. I'll do some more testing and send a PR :)

eabase commented 2 years ago

@rashil2000 any pr on the horizon?

eabase commented 2 years ago

Just keep in mind the difference between hardlinks, junctions, symbolic links, shortcuts, etc. Lot's of things there...

rashil2000 commented 2 years ago

Not yet. Reason being, I rely on other CLI utilities for disk usage now (for example, gdu in Go or dua in Rust) as PowerShell is just too slow for this work.

However, it has been partly fixed in the issue I linked above, see https://github.com/gngrninja/PSFolderSize/commit/adf71c7ed046f5eb2fdc2028aebb12ddcab666f8.