kylemanna
1/8/2015 - 8:43 PM

defrag-btrfs.sh

#!/bin/bash

#
# Search $1 path (default to /) for files with over $2 (defaults to 100) fragments and attempts to defragment them.
#
# Author: Kyle Manna
#

root=${1:-/}
min=${2:-100}

find $root -xdev -type f -print0 | xargs -0 filefrag | sed -e "s/^\(.*\): \(.*\) extents found/\2 \1/" | awk "{ if (\$1 > $min) print \$0; }" | while read line; do
    file=${line#* }
    before=${line%% *}
    btrfs filesystem defrag "$file"
    after=$(filefrag "$file" | sed -e "s/^\(.*\): \([0-9]\+\) extents\? found/\2/")
    echo "$file: $before -> $after"
done