我一直在尝试找到一种方法,通过将文件夹移动到另一个驱动器来释放驱动器上的一些空间。我有一个文件夹,里面装满了我可以移动的东西,不需要全部移动,以释放一些空间。
在 Windows 中,我只需选择一堆文件夹,获取属性,它会告诉我它占用了多少空间,我会选择更多或更少,然后移动它们。我无法从 bash 终端执行此操作,而且我不知道该怎么做。谷歌搜索不断引导我移动超过一定大小的所有文件,这不是我想要做的。
答案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 *
从该 glob 的扩展中移动尽可能多的文件*
以构成至少 1GiB。
答案2
您几乎可以在终端中执行完全相同的操作:
首先执行cd /path/to/full/drive/
进入已填满的驱动器的根文件夹。
然后,要查看您可以使用的驱动器内每个文件夹占用的容量du -hd1
(假设是 GNU 实现du
)。
说明:(du
磁盘使用情况)从当前文件夹在文件树上递归运行,打印每个文件夹使用的容量。默认情况下,它打印为 512 字节单位或 kibibytes 的数量(取决于 POSIXLY_CORRECT 是否处于有点不可读的环境中),因此该-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 .