2

我有一个相当大的文件,我正在尝试理解。我使用 du -ah 命令生成了一个包含大量文件的整个目录结构的列表。结果基本上以纯文本格式列出了特定文件夹下的所有文件夹以及文件夹内的后续文件。

例如:

4.0G    ./REEL_02/SCANS/200113/001/Promise Pegasus/BMB 10/RED EPIC DATA/R3D/18-09-12/CAM B/B119_0918NO/B119_0918NO.RDM/B119_C004_0918XJ.RDC/B119_C004_0918XJ_003.R3D
3.1G    ./REEL_02/SCANS/200113/001/Promise Pegasus/BMB 10/RED EPIC DATA/R3D/18-09-12/CAM B/B119_0918NO/B119_0918NO.RDM/B119_C004_0918XJ.RDC/B119_C004_0918XJ_004.R3D
15G ./REEL_02/SCANS/200113/001/Promise Pegasus/BMB 10/RED EPIC DATA/R3D/18-09-12/CAM B/B119_0918NO/B119_0918NO.RDM/B119_C004_0918XJ.RDC

是否有任何我可以运行的命令或我可以使用的实用程序来帮助我确定是否有多个相同文件名的记录(通常是每行的最后 16 个字符 + 扩展名)以及是否存在这样的重复条目,将整个路径(整行)写出到另一个文本文件,这样我就可以使用脚本或其他东西从我的 NAS 中找到并移出重复文件。

请让我知道,因为当纯文本文件本身为 5.2Mb 时,这样做会非常有压力:)

4

4 回答 4

4

拆分每一行/,得到最后一项(cut不能这样做,所以恢复每一行并取第一个),然后排序并运行uniq显示-d重复项。

rev FILE | cut -f1 -d/ | rev | sort | uniq -d
于 2013-05-20T08:31:23.697 回答
0

我不完全确定你想在这里实现什么,但我觉得你无论如何都在以一种困难的方式做到这一点:) 你的文本文件似乎包含文件中的空格,这使得它难以解析。

我认为您想查找名称重复的所有文件。我将从以下内容开始:

 find DIR -type f -printf '%f\n' | uniq -d

这意味着

  • DIR - 在此目录中查找文件
  • '-type f' - 只打印文件(不是目录或其他特殊文件)
  • -printf '%f' - 不使用默认查找输出格式,只打印每个文件的文件名
  • uniq -d - 只打印多次出现的行

您可能只想列出一些文件,而不是所有文件。您可以限制要查找的更多规则考虑哪些文件。如果您只关心 *.R3D 和 *.RDC 文件,您可以使用

find . \( -name '*.RDC' -o -name '*.R3D' \) -type f -printf '%f\n' | ...

如果我猜错了你需要什么,对不起:)

于 2013-05-20T08:31:49.520 回答
0

以下将扫描当前子目录(使用find)并打印重复文件的完整路径。您可以调整它采取不同的操作,例如删除/移动重复文件。

while IFS="|" read FNAME LINE; do
    # FNAME contains the filename (without dir), LINE contains the full path
    if [ "$PREV" != "$FNAME" ]; then
        PREV="$FNAME"  # new filename found. store
    else
        echo "Duplicate : $LINE"  # duplicate filename. Do something with it
    fi
done < <(find . -type f -printf "%f|%p\n" | sort -s)

要试用它,只需将其复制粘贴到 bash shell 中或将其保存为脚本。

注意:

  • 由于sort,文件列表必须在循环开始之前加载到内存中,因此性能将受到返回的文件数量的影响
  • 文件出现在 a 之后的顺序sort将影响哪些文件被视为重复文件,因为第一次出现的文件被假定为原始文件。这些-s选项确保了稳定的排序,这意味着顺序将由find.

一种更直接但不太稳健的稳健方法将类似于以下内容:

find . -type f -printf "%20f %p\n" | sort | uniq -D -w20 | cut -c 22-

这将打印所有具有重复条目的文件,假设最长的文件名将是 30 个字符长。输出与上述解决方案的不同之处在于列出了所有具有相同名称的条目(不是N-1上述条目)。

您需要更改find,uniqcut命令中的数字以匹配实际情况。数字太小可能会导致误报。

find . -type f -printf "%20f %p\n" | sort | uniq -D -w20 | cut -c 22-
----------------------------------   ----   ------------   ----------
                |                      |          |               |
   Find all files in current dir       |          |               |
   and subdirs and print out           |    print out all         | 
   the filename (padded to 20          |    entries that          | 
   characters) followed by the         |    have duplicates       | 
   full path                           |    but only look at      |  
                                       |    the first 20 chars    |
                                       |                          |
                                 Sort the output          Discard the first
                                                          21 chars of each line
于 2013-05-20T08:48:09.680 回答
0

我认为您正在寻找 fslint:http ://www.pixelbeat.org/fslint/

它可以找到重复的文件、断开的链接和类似的东西。

于 2013-05-20T12:17:06.653 回答