【问题标题】:How to create a patch file for text files only in a directory如何仅在目录中为文本文件创建补丁文件
【发布时间】:2021-05-14 14:03:12
【问题描述】:

我有一个包含数百个文本文件和目标文件的目录。我在其他地方有这个目录的副本,我对其进行了编辑并重新编译。目标文件现在不同了,但我只想从文本文件生成补丁。有没有办法做到这一点,还是我需要将它们分成不同的文件夹?

diff -uraN original/new/ > patch.diff

如何在此命令中指定文件类型?

-X 排除,但我想要与此相反。我想排除除 .txt 文件之外的所有内容

【问题讨论】:

    标签: linux bash diff patch


    【解决方案1】:

    您希望每个 txt 有一个差异吗?

    for f in original/*.txt                        # for each original
    do  d=${f#original/}                           # get base name
        diff -uraN "$f" "new/$d" > ${d%.txt}.diff  # diff old against new
    done
    

    你提到-X;我不确定diff 是如何实现它的,但 bash CLI 允许扩展通配符。

    $: shopt -s extglob
    $: ls -l *.???
    -rw-r--r-- 1 P2759474 1049089         0 May 10 21:49 OCG3C82.tmp
    -rw-r--r-- 1 P2759474 1049089         0 May 11 03:22 OCG511D.tmp
    -rw-r--r-- 1 P2759474 1049089         0 May 12 00:03 OCG5214.tmp
    -rw-r--r-- 1 P2759474 1049089         0 May 14 09:34 a.txt
    -rw-r--r-- 1 P2759474 1049089         0 May 14 09:34 b.txt
    
    $: ls *.!(txt)
    -rw-r--r-- 1 P2759474 1049089         0 May 10 21:49 OCG3C82.tmp
    -rw-r--r-- 1 P2759474 1049089         0 May 11 03:22 OCG511D.tmp
    -rw-r--r-- 1 P2759474 1049089         0 May 12 00:03 OCG5214.tmp 
    

    【讨论】:

    • 我实际上希望所有这些都在同一个补丁文件中,但我会运行您的脚本,然后使用 combineiff 将它们全部合并到一个补丁文件中
    【解决方案2】:

    如果我正确理解您的问题,您只想对扩展名为 .txt 的任何文件执行 diff 命令。

    不幸的是,diff 没有包含选项,但我们可以通过使用 find 来绕过它来获取不是文本文件的文件列表,然后我们可以使用 -X 排除那些文件。这一个班轮会做到这一点。

    find original new ! -name '*.txt' -printf '%f\n' -type f | diff -uraN original/ new/ -X - > patch.diff
    

    如果您想了解更多有关其工作原理的信息,可以查看 finddiff 的手册页。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多