Disk fragmentation has a lot to do with the way the file systems are designed. Concerning GNU/Linux, thanks to advanced file systems like Ext3/Ext4 for instance, there’s somewhat little need for data de-fragmentation when comparing with MS Windows.
But if you’re a MS Windows user who frequently install a lot of software and move files around, then the OS comes with a built in tool called “disk defragmenter” which is pretty decent. But there are more dedicated tools that come with a lot of additional features.
I’m pretty sure there are a reasonable amount of excellent tools, both paid and free but if you’re looking for an open source (GNU/GPL), free & powerful disk defragmenter for MS Windows… then UltraDefrag is an excellent tool.
*. Comes with both a GUI and a command-line version.
*. Analyze your disk drives and gives reports (with graphical representations -- cluster maps).
*. Comes with 3 types of data de-fragmentation methods:
1. Quick optimization -- Simple de-fragmentation… you may not get the best possible results … but still it’s the fastest method if you want a basic optimization.
2. Full Optimization -- The best possible data de-fragmentation.
3. Defrag MFT -- This is sort of like the “index” of the NTFS file system thus this feature will only defragment the MFT for optimal performance.
*. Skip removable media.
*. Ability to Shutdown/Reboot/Log-Off/, etc when done.
*. Boot time defragmentation -- Another feature that’s pretty useful to defrag files that are “locked” while the OS is fully operational otherwise.
*. Integrates into the MS Explorer right-click menu which makes individual file de-fragmentation a breeze.
*. Supports both 32/64-bit versions.
My only complain is that unlike with many other tools we cannot “pause” the defragmentation job which is useful since we can “resume” from where we stopped last time. But then again this could be a feature that’s there to prevent data fragmentation because when we resume, there’s the possibility of “skipping” some of the changes occurred in the file system while the task is paused.