【问题标题】:Comparing two files based on size根据大小比较两个文件
【发布时间】:2016-01-13 06:06:22
【问题描述】:

我在提取不同大小的唯一文件时遇到困难。

问题:在一个目录中有几个文件,假设有 2 个 2 mb 的文件、4 个 4 mb 的文件和 3 个 6 mb 的文件。

现在,我们需要运行一个脚本来检查所有文件及其大小,并且只打印第一次出现的不同大小的文件。

例如。如果它读取一个文件 f1 并且它是一个 2mb 的文件,它将执行 ls -al of f1

下次如果它得到一个 2 mb 大小的文件,它将跳过它

因此在这种情况下,它将仅打印 3 个不同大小的文件,分别为 2 mb、4 mb 和 6 mb。

[sumit.gupta@abc ~]$ ll mytestfolder/
total 38972
-rw-rw-r-- 1 sumit.gupta sumit.gupta 2097152 Jan  6 23:26 f1
-rw-rw-r-- 1 sumit.gupta sumit.gupta 2097152 Jan  6 23:27 f2
-rw-rw-r-- 1 sumit.gupta sumit.gupta 4194304 Jan  6 23:28 f3
-rw-rw-r-- 1 sumit.gupta sumit.gupta 4194304 Jan  6 23:28 f4
-rw-rw-r-- 1 sumit.gupta sumit.gupta 6291456 Jan  6 23:28 f5
-rw-rw-r-- 1 sumit.gupta sumit.gupta 6291456 Jan  6 23:28 f6
-rw-rw-r-- 1 sumit.gupta sumit.gupta 4194304 Jan 13 11:11 f7
-rw-rw-r-- 1 sumit.gupta sumit.gupta 4194304 Jan 13 11:12 f8
-rw-rw-r-- 1 sumit.gupta sumit.gupta 6291456 Jan 13 11:12 f9

我正在脚本中尝试以下代码:

#!/bin/bash

source="/home/sumit.gupta/mytestfolder/"

ls -ltr /home/sumit.gupta/mytestfolder | cut -d ' ' -f 5,10 | \
    head -n -1 > /tmp/abc.txt
ls -ltr /home/sumit.gupta/mytestfolder | cut -d ' ' -f5 | \
    uniq > /tmp/def.txt
grep -F -vf /tmp/def.txt /tmp/abc.txt > xyz.txt

【问题讨论】:

  • 请在问题中添加您的结果以及为什么它们不符合您的愿望。
  • 不要parse the output of ls 它会在您不期望的时候添加问题。
  • 感谢您的反馈。这是输出: [sumit.gupta@abc ~]$ sh input.sh [sumit.gupta@abc ~]$ [sumit.gupta@abc ~]$ cat xyz.txt [sumit.gupta@abc ~]$ 我是得到空白结果。感谢@pax,现在问题解决了。
  • 此输出应添加到问题帖子本身,因为它是问题描述的一部分。

标签: linux grep centos ls du


【解决方案1】:

您可以使用“du -h directory_name/file_name”获取文件大小,并将其与输入文件大小进行比较。

【讨论】:

    【解决方案2】:

    假设您没有因处理 ls 的输出而被咬(即,您输出的行始终具有第 5 列中的大小,并且不要做奇怪的事情,例如在文件名中嵌入换行符),这是使用awk 可以轻松完成的事情。

    它只处理一次输入并记录已经看到的大小,这样它就不会输出相同大小的后续文件:

    pax> ll mytestfolder/ | awk '!seen[$5] {print; seen[$5] = 1}'
    -rw-rw-r-- 1 sumit.gupta sumit.gupta 2097152 Jan  6 23:26 f1
    -rw-rw-r-- 1 sumit.gupta sumit.gupta 4194304 Jan  6 23:28 f3
    -rw-rw-r-- 1 sumit.gupta sumit.gupta 6291456 Jan  6 23:28 f5
    

    【讨论】:

    • 您可以使用以下方法创建测试文件:(只是说;)) dd if=/dev/zero of=/directory/f1 bs=1M count=2 但是,您的逻辑有效!非常感谢。 :)
    • @sumitgupta,想到了一个更好的解决方案,使用 just awk 和单次数据传递,如果它像您的管道一样通过管道传递,这是至关重要的。
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2015-12-02
    • 2017-07-25
    • 1970-01-01
    • 2021-01-28
    • 2018-08-17
    相关资源
    最近更新 更多