動機
ファイルを移動・整理する際の、「移動先の容量を調べ、移動元から必要なサイズのみファイルを取り出す」作業が面倒なため
コマンド
mvl /path/to/source /path/to/destination (転送サイズ 例:10G) (findの転送オプション -type fはデフォルトで指定済)
mvl
#!/bin/bash
BASEDIR=$1
DISTDIR=$2
LIMITSIZE_HR=$3
LIMITSIZE=`numfmt --from=iec $LIMITSIZE_HR`
FINDARGS=${@:4}
DISTFREE=$(( `df --output=avail $DISTDIR | sed 1d` * 1024)) #dfの先頭行を除去
DISTFREE_HR=`numfmt --to=iec $DISTFREE`
TOTAL=0
while read -r file; do
FILESIZE=`wc -c < "$file"` #ファイルサイズだけを取得
TOTAL=$((TOTAL + FILESIZE )) #移動予定のファイルを合計予定サイズに加える
TOTAL_HR=`numfmt --to=iec $TOTAL`
#合計予定サイズが残り空き容量以下、かつ指定転送量以下の場合のみ移動を実施
if [ $TOTAL -gt $DISTFREE ]; then
echo "Don't Enough FreeSpace $TOTAL_HR > $DISTFREE_HR"
break
fi
if [ $TOTAL -gt $LIMITSIZE ]; then
echo "over $TOTAL_HR > $LIMITSIZE_HR"
break
fi
echo "MOVE $file to $DISTDIR (TransferTotal:$TOTAL_HR)"
mv "$file" $DISTDIR
DISTFREE=$(( `df --output=avail $DISTDIR | sed 1d` * 1024)) #空き容量を更新
DISTFREE_HR=`numfmt --to=iec $DISTFREE`
done <<< "$(find $BASEDIR -type f $FINDARGS)"
仕様
findの検索された順に処理する
コピー先にコピー予定のファイルが収まらない、または指定した転送サイズ以上になる場合は処理を終了。後続の転送可能なサイズのファイルを探すことはしない。
ソースディレクトリのフォルダ構造は再現しない
感想
ファイルサイズ制限を相互の変換する「numfmt」を初めて知った
↧