【问题标题】:diff directories a and b. show only files in b, not in a区分目录 a 和 b。仅显示 b 中的文件,而不显示 a 中的文件
【发布时间】:2013-03-27 19:34:07
【问题描述】:

标题总结了我的问题。给定目录 a 和 b,我希望能够生成 b 中但不在 a 中的文件列表。

普通的 diff 可以做到这一点,但它也会显示 a 中的文件,而不是 b 中的文件:

$ diff -u /mnt/Media/a ~/b    
Only in /mnt/Media/a: abab
Only in /home/conor/b: blah

我还希望 diff 仅列出文件名 - 没有“仅在 ..”中的内容

谢谢

【问题讨论】:

    标签: unix diff


    【解决方案1】:

    试试这个

    选择其中之一:

    $ LANG=C diff -qr a b | awk -F"Only in b: " '/^Only in b:/{print $2}'
    

    $ LANG=C diff -qr a b | grep -oP "^Only in b: \K.*"
    

    $ LANG=C diff -qr a b | grep '^Only in b:' | cut -d: -f2-
    

    注意

    LANG=C
    

    只是为了避免以英语以外的任何语言显示。

    文档

    man diff

    【讨论】:

    • 嗨,这对我不起作用。仅使用“LANG=C diff -aqr a b”它列出了两个目录之间的差异.. -a 选项用于作为文本进行比较?我不想这样做,因为我比较的文件不是文本
    • 是的,这是文本。删除了-a 开关。如果它仍然“不起作用”,请告诉我们到底出了什么问题。
    • 好吧,它列出了 a 中不在 b 中的文件和 b 中不在 a 中的文件。根据标题,我只想列出后面的 - b 中不在 a 中的文件
    • 仔细阅读我的回答
    • 啊好的,抱歉,正在使用命令的前半部分进行测试。现在使用您的完整答案工作。谢谢
    【解决方案2】:

    uniq 命令比您想象的更有用。考虑两个目录dirAdirB

    % ls -R dirA dirB
    dirA:
    s1/ s2/
    
    dirA/s1:
    f2
    
    dirA/s2:
    f1  f2
    
    dirB:
    s1/ s2/
    
    dirB/s1:
    f1  f2
    
    dirB/s2:
    f1
    %
    

    dirA 中缺少文件s1/f1dirB 中缺少文件s2/f2

    创建两个目录的内容列表:

    % (cd dirA; find . -type f >../listA)
    % (cd dirB; find . -type f >../listB)
    

    现在在listB 中找到存在的行:

    % cat listA listA listB | sort | uniq -u 
    ./s1/f1
    % 
    

    哒哒!

    【讨论】:

      【解决方案3】:

      通常,当我必须这样做时,我会采用低技术:

      cd ~/a
      find . -type f | sort > ~/fooa
      cd ~/b
      find . -type f | sort > ~/foob
      vimdiff ~/fooa ~/foob
      

      它可以让我改进结果。 “哦,哎呀,我想从 ~/a 中排除 .svn 目录”,所以重新运行不带 .svn 目录的 ~/fooa 文件,然后重新比较。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-04
        • 2012-06-26
        • 2023-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多