AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 48119
Accepted
Bill Gray
Bill Gray
Asked: 2009-07-31 07:35:43 +0800 CST2009-07-31 07:35:43 +0800 CST 2009-07-31 07:35:43 +0800 CST

如何测量目录中文件的大小?

  • 772

我有一个装满 600gb 文件的文件夹。我想自动将前 300 个复制到一个文件夹,其余的复制到另一个文件夹。我不确定如何使用 ls 或其他任何方法来限制结果,以便我可以将其作为参数传递......

平台是linux...

编辑:我想移动 300gb,而不是前 300 个文件。文件大小是任意的,排序无关紧要。

linux files
  • 9 9 个回答
  • 1472 Views

9 个回答

  • Voted
  1. Best Answer
    Kyle Brandt
    2009-07-31T08:07:34+08:002009-07-31T08:07:34+08:00

    更新:哦,前 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。

    • 5
  2. nik
    2009-07-31T07:56:10+08:002009-07-31T07:56:10+08:00

    这是一种获得几乎相等的 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)并将一个目录/文件
    从较大列表移动到较小列表的差异大约一半。
    那应该让你非常接近

    • 2
  3. Benoit
    2009-07-31T07:46:05+08:002009-07-31T07:46:05+08:00

    您可以使用find、head和xargs来做到这一点。它应该如下所示:

    find ./ -type f -print0 | head -300 | xargs -0 -I mv {} /one/folder
    find ./ -type f -print0 | xargs -0 -I mv {} /another/folder
    
    • 1
  4. Wim ten Brink
    2009-07-31T09:55:15+08:002009-07-31T09:55:15+08:00

    警告!当您开始计算文件大小时,您很可能会错误地以字节来衡量它们,而大多数文件系统会以块为单位分配磁盘空间。这个块大小因磁盘而异,但通常是 512 的倍数。

    基本上,这意味着您可以拥有 500 个文件,每个文件只有 500 个字节。但是一个为每个块分配 2048 字节的文件系统因此会占用大约 1 兆字节的磁盘空间。是的,这是很多开销。

    基本上,您应该通过您使用的文件系统的块大小来四舍五入获得的文件大小。这样,您可以更精确地测量它们。

    话又说回来,有多大的区别?如果块大小为 2048 字节,则“丢失”的平均字节数将为 1 KB。对于 300 个文件,这将是大约 300 KB,除了总大小之外,您还需要更多。您想复制 300 GB,但要复制多少个文件?两个磁盘是否使用具有相同块大小的相同文件系统?

    无论如何,误差范围取决于平均文件大小。如果您有很多大文件(音乐、图像、二进制文件),则误差范围会非常小。如果您有很多小文件(如脚本、源文件和文本文件),那么误差范围可能很容易使总文件大小再增加 30 GB,这是您没有考虑的...

    所以,测量文件大小并不容易......

    • 1
  5. Chad Huneycutt
    2009-07-31T07:52:36+08:002009-07-31T07:52:36+08:00

    您可以通过拉出大小ls -l或使用以下du命令来获取文件使用情况列表:

    $ cd /dirwithlotsoffiles $ du -k *

    这将打印以千字节为单位的文件大小列表,后跟文件名。

    • 0
  6. Jorge Bernal
    2009-07-31T07:55:17+08:002009-07-31T07:55:17+08:00

    “查找”答案将复制前 300 个文件,而不是我理解的请求的前 300GB。

    您可以尝试使用 tar 及其多卷选项

    • 0
  7. CK.
    2009-07-31T08:17:16+08:002009-07-31T08:17:16+08:00

    一种非常粗略的方法是遍历按大小排序的文件(ls -S),然后简单地将每个备用文件移动到其中一个子目录中。这个怎么样:

    #!/usr/bin/bash
    dir1=path/to/dir1
    dir2=path/to/dir2
    a=0
    for file in `ls -1S`
    do
      a=`expr $a + 1`
      even=`expr $a%2|bc`
      if [ $even -gt 0 ]
      then
        mv $file $dir1
      else
        mv $file $dir2
      fi
    done
    

    ~

    • 0
  8. Bart B
    2009-07-31T08:19:02+08:002009-07-31T08:19:02+08:00

    恐怕您可能不得不在这里编写一些脚本。您可以使用终端命令 ls -l 轻松获取文件列表及其大小,然后您必须编写一个脚本来遍历该列表并逐个复制文件并保留一个计数器来记录文件的数量KB 传输至今。每次检查我们是否移动了 300GB 的值,如果没有,移动另一个文件。它可能在大约 10 行或更少的 Perl 中是可行的。

    • 0
  9. Thorbjørn Ravn Andersen
    2009-07-31T08:40:20+08:002009-07-31T08:40:20+08:00

    您可以通过简单地获取文件名列表以及每个文件的大小来获得合理的结果。首先按照最大的大小对文件进行排序。然后只需复制列表中适合目标目录剩余空间的最大文件并将其从列表中删除。重复直到没有更多的文件适合。

    然后从新的目标目录重新开始。重复直到列表为空。

    • 0

相关问题

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

  • 在 SQL Server 中,何时应将 PRIMARY Data FileGroup 拆分为辅助数据文件?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve