Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何仅为目录中的文本文件创建修补程序文件_Linux_Bash_Diff_Patch - Fatal编程技术网

Linux 如何仅为目录中的文本文件创建修补程序文件

Linux 如何仅为目录中的文本文件创建修补程序文件,linux,bash,diff,patch,Linux,Bash,Diff,Patch,我有一个包含数百个文本文件和对象文件的目录。我在其他地方有一份这个目录的副本,我编辑并重新编译了它。对象文件现在不同了,但我只想从文本文件生成一个补丁。有没有办法做到这一点,或者我需要将它们分离到不同的文件夹中 diff-uraN原装/新款/>补丁.diff 如何在此命令中指定文件类型 -X不包括,但我想要的是相反的结果。我想排除除.txt文件以外的所有文件是否希望每个txt有一个差异 for f in original/*.txt # for ea

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

diff-uraN原装/新款/>补丁.diff

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


-X不包括,但我想要的是相反的结果。我想排除除.txt文件以外的所有文件

是否希望每个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 

您希望每个文本有一个差异吗

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 

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

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

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

如果您想了解有关如何工作的更多信息,可以查看
find
diff
的手册页。如果我正确理解了您的问题,您只需对扩展名为
.txt
的任何文件执行
diff
命令即可

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

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

如果你想了解更多关于如何工作的信息,你可以查看
find
diff

的手册页,我实际上希望它们都在同一个补丁文件中,但我会运行你的脚本,然后使用combinediffI将它们合并到一个补丁文件中,我实际上希望它们都在同一个补丁文件中,但我会运行您的脚本,然后使用combinediff将所有脚本合并到一个补丁文件中