フォルダを別のドライブに移動して、ドライブのいくつかのスペースを解放する方法を見つけようとしました。スペースを確保するために、すべて移動せずに移動できるアイテムでいっぱいのフォルダがあります。
Windowsでは、複数のフォルダを選択してプロパティをインポートすると、そのフォルダが占めるスペースがどのくらいあるかを知らせ、より多くまたは少なく選択してフォルダを移動します。 bash端末ではこれを行うことができず、どうすればよいかわかりません。 Google検索では、すべてのファイルを特定のサイズ以上に移動し続けますが、これは私が望むものではありません。
答え1
GNUシステムでは、次のように書くことができます。
#! /bin/bash -
usage() {
printf >&2 '%s\n' "Usage: $0 <destination> <size> [<file1> [<file2>...]]"
exit 1
}
(($# >= 2)) || usage
dest=$1
size=$(numfmt --from=iec <<< "$2") || usage
shift 2
(($# == 0)) && exit
selected=()
sum=0
shopt -s lastpipe
LC_ALL=C du -s --null --block-size=1 -- "$@" |
while
((sum < size)) &&
IFS= read -rd '' rec &&
s=${rec%%$'\t'*} &&
file=${rec#*$'\t'}
do
selected+=("$file")
((sum += s))
done
((${#selected[@]} == 0)) ||
exec mv -t "$dest" -- "${selected[@]}"
たとえば、次のように使用されます。
that-script /dest/folder 1G *
*
少なくとも1GiBを設定するには、glob拡張子でできるだけ多くのファイルを移動してください。
答え2
端末でもほぼ同じことができます。
cd /path/to/full/drive/
満たされたドライブのルートフォルダに移動して起動します。
次に、利用可能なドライブ内の各フォルダが占める容量を見てみましょうdu -hd1
(GNU実装を想定していますdu
)。
説明:(du
ディスク使用量)現在のフォルダのファイルツリーで繰り返し実行し、各フォルダが使用する容量を印刷します。デフォルトでは、POSIXLY_CORRECTが読みやすくない環境にあるかどうかに応じて512バイト単位またはキビバイト数で印刷するため、この-h
オプションはサイズを「人間が読める」サイズ(MB / GBに変換)で印刷するように指示します。このd
パラメータは、du
指定された「深さ」(この場合は1)に達した後にファイルツリーに降りるのを強制的に停止します。
コンテンツを移動する特定のディレクトリを見つけたら、ls -lh
そのディレクトリ内のファイルサイズビューを使用して、移動したい特定のファイルを識別できます。これにより、h
印刷サイズが「人間が読める」にリセットされ、-l
ファイルサイズを含む「長い」形式が表示されます。
ボーナスポイント:次のように操作を簡単にするために、du
パイプsort
(ここでGNUを再仮定sort
)を使用してサイズ別にソートされた出力を取得できます(ファイル名に改行文字が含まれていないと仮定)。
du -hd1 | sort -h
ls
オプションが提供されている場合は、出力をサイズで並べ替えることもできます-S
。
ls -lhrS
最後にファイル/フォルダを移動するには、このコマンドを使用できますmv /path/to/source /path/to/target
。
問題のドライブのルートフォルダが何であるかを知っているとします。
答え3
使用du -hd1
-h人が読める形式でサイズを印刷します。
-d<1> はディレクトリの深さです。
例:
$ du -hd1
11G ./dir1
9.5G. ./dir2
11G ./dir3
6.3G ./dir4
9.1G ./dir5
6.4G ./dir6
4.8G ./dir7
58G .