我有一个文件夹,里面装满了 600GB 的文件。我想自动将前 300 个文件复制到一个文件夹,其余文件复制到另一个文件夹。我不确定如何使用 ls 或其他任何命令来限制结果,以便我可以将其作为参数传递...
平台是linux...
编辑:我想移动 300gb,而不是前 300 个文件。文件大小任意,顺序无所谓。
答案1
更新:哦,第一个 300GB,那么...这可能很慢,取决于文件大小,但我喜欢练习 :-)
filesize=0
for i in *; do
filesize=$(stat -c "%s" "$i");
(( totalsize += filesize ));
if [[ $totalsize < 322122547200 ]]; then
mv "$i" first_300/
else
mv "$i" the_rest/
fi
done
希望 int 的大小没有问题。
如果您的意思是将它们分成多个文件夹,每个文件夹包含 300 个文件,也许您需要以下内容:
folder=0
counter=0
for i in *; do
mv $i foo_$folder/
if [[ $(( counter % 10 )) -eq 0 ]]; then
(( folder++ ));
fi
(( counter++ ))
done
尽管这可能不如某些 find 命令那么快。如果您只想执行前 300 条命令,则可以使用相同的计数器策略,但使用 while $counter -le 300。
答案2
这是一种获得几乎平等的 300gb 分配的方法,
您可以进行du
基于搜索来查找跨顶级目录和文件的分布,然后通过一些试验将它们分成近两部分。
find . -maxdepth 1 -type d -exec du -sk {} \; | sort -n -k 1 > list.txt
这将给出一个按KB
大小排序的列表。
你可以使用一些技巧,比如在这个列表中挑选交替的线条,以便快速实现几乎均匀的分布
awk '{if (FNR%2==1) print $2}' list.txt > list1.txt
awk '{if (FNR%2==0) print $2}' list.txt > list2.txt
非常粗糙的分布...
最后,如果你的文件或目录大小非常不均匀——远远达不到 300GB 的分布,
那么请远离装箱问题并在两个列表文件之间移动几行进行一些简单的尝试。
找出两组之间的差异(使用du
),并将差异约为较大列表的一半的目录/文件移动
到较小列表。
这样应该会非常接近
答案3
你可以这样做寻找,头&参数。它应该看起来像这样:
find ./ -type f -print0 | head -300 | xargs -0 -I mv {} /one/folder
find ./ -type f -print0 | xargs -0 -I mv {} /another/folder
答案4
您可以通过提取文件大小ls -l
或使用以下du
命令来获取文件使用情况列表:
$ cd /dirwithlotsoffiles $ du -k *
这将打印文件大小(以千字节为单位)的列表,后跟文件名。