我在编写 bash 脚本时遇到问题
我知道 ls 会列出目录中的文件,但我希望它列出目录 1 但不在目录 2 中的目录,然后列出目录 2 中不在目录 1 中的文件。
在一次微弱的尝试中,我尝试了:
ls -al | diff directory1 directory2
Run Code Online (Sandbox Code Playgroud)
我很快意识到为什么它不起作用。任何人都可以帮助一个彻头彻尾的 bash 书呆子吗?
我过去曾尝试使用 linuxdiff命令,但没有太多运气或耐心。我通常最终会使用像 DiffMerge 或 Kdiff 这样的 GUI 实用程序。
最近我开始diff再次尝试通过 ssh 来比较远程系统上的文件,我发现这个-y / --side-by-side选项非常有用,但我仍然觉得我没有充分利用这个实用程序。
所以我很好奇如何实现以下目标:
另外,我在谷歌搜索时没有找到很多好的例子,所以如果你有一些 linux-fu 的秘密来充分利用 diff,你能分享一下吗?我将主要比较基于文本的配置文件,但任何技巧和技巧都会很棒。
供参考- DiffMerge 实用程序可以轻松地通过颜色突出显示并排显示更改。顶部的图标允许您在“显示全部”、“显示差异”和“显示与上下文的差异”视图之间切换。在命令提示符下会喜欢这些功能。
ps:我还应该指出,我认为非常有用的另一个选项是我--suppress-common-lines在这篇简洁易读的博客文章中了解到的。
我尝试制作此处介绍的补丁。
说我有两个目录pp1(modified version)和pp0(clean version)我打个补丁文件,pp0.patch用diff命令:
diff -crB pp0 pp1 > pp0.patch
Run Code Online (Sandbox Code Playgroud)
问题是如果只有 pp1 中有一个文件,它不会包含在补丁中。如何解决它?
更新:
我首先进入pp0目录,测试补丁是否成功
patch --dry-run -p1 -i /path-to-pp0.patch
Run Code Online (Sandbox Code Playgroud)
虽然我已经添加--new-file到diff命令中,但pp1结果中没有列出那些只在
更新:
我不小心修补了错误的文件,所以
diff -crb --new-file pp1 pp0 > pp0.patch
Run Code Online (Sandbox Code Playgroud)
或者
diff -crNb pp1 pp0 > pp0.patch
Run Code Online (Sandbox Code Playgroud)
会做
bdiff(1)Solaris 中有一个命令,它允许您处理diff(1)大于 RAM 大小的文件(http://docs.oracle.com/cd/E19683-01/806-7612/files-23/index.html)。
Linux 中有类似的东西吗?我试过谷歌搜索,但我没有bdiff在 Ubuntu 中找到哪个包。
我有两个包含以下数据的文件;我需要两个文件之间的区别。
我尝试过,diff但它也显示了两个文件中常见的行:(22372 Dec 4 15:36 /opt/apache-tomcat-6.0.36/webapps/new/new.txt).
第一个文件:(文件1中以相同方式存在多个数据)
22677 Dec 4 15:36 /opt/apache-tomcat-6.0.36/webapps/new/abc.txt
22372 Dec 4 15:36 /opt/apache-tomcat-6.0.36/webapps/new/new.txtRun Code Online (Sandbox Code Playgroud)
第二个文件:(文件 2 中以相同方式存在多个数据)。
22372 Dec 4 15:36 /opt/apache-tomcat-6.0.36/webapps/new/new.txt
22677 Dec 3 15:36 /opt/apache-tomcat-6.0.36/webapps/new/abc.txt
12344 Dec 10 15:36 /opt/apache-tomcat-6.0.36/webapps/abc/.../test.txtRun Code Online (Sandbox Code Playgroud)
我需要以下输出:
22677 Dec 3 15:36 /opt/apache-tomcat-6.0.36/webapps/new/abc.txt
12344 Dec 10 15:36 /opt/apache-tomcat-6.0.36/webapps/abc/.../test.txtRun Code Online (Sandbox Code Playgroud) 我有一个包含大约 7,000 个音乐文件的目录。我使用 lame 递归地将其中的所有文件重新编码到一个单独的目录中,输出具有相同相对路径和文件名的所有文件。输出文件具有 .mp3 扩展名,但某些输入文件具有不同的扩展名(.wma、.aac 等)。
我可以看到输出目录中缺少 ~100 个文件的文件计数差异。我想要做的是运行两个目录的比较并获取源中存在但不在目标中的文件列表。这很简单,除非我需要忽略文件扩展名的差异。
我试过在干运行打开的情况下使用 rsync,但我想不出一种方法来忽略文件扩展名。我也尝试过 diff,但无法找到仅按名称检查但忽略文件扩展名的选项。我开始想我可以在两个目录上执行递归 ls,删除文件扩展名,然后比较输出,但我真的不知道从哪里开始使用 sed 或 awk 修改 ls 输出。
在初学者的Bash 指南(第3.2.1.2 节。局部变量)中有一个示例命令,它应该列出所有不在环境变量中的局部变量,或者我认为:
diff set.sorted printenv.sorted | grep "<" | awk '{ print $2 }'
Run Code Online (Sandbox Code Playgroud)
除了*.sorted部分,我相信我了解有关此命令的所有内容。此外,这个命令在我的 Bash 上不起作用,特别是因为上述元素。这是响应(这是No such file or directory的波兰语版本):
diff: set.sorted: Nie ma takiego pliku ani katalogu
diff: printenv.sorted: Nie ma takiego pliku ani katalogu
Run Code Online (Sandbox Code Playgroud)
值得注意的是,我使用的是 Ubuntu 14.04,其默认安装几乎没有变化。
正因为如此,我无法在我的 Bash shell 中分析这个命令,我也无法在谷歌上找到任何关于这个的东西,除了我从中获取这个命令的教程。
我将不胜感激,因为我以前从未遇到过这样的表达方式。
我有两个 SQL 文件,old.sql一个是new.sql.
假设old.sql包含一个包含三个字段的表,Emp_Id、Name 和 Address 以及存储在 old.sql 中的数据如下:
Insert into table1 values (101 ,"a", "xyz");
Insert into table1 values (102 ,"b", "pqr");
Run Code Online (Sandbox Code Playgroud)
然后我将“a”地址“xyz”更改为“xyz123”并将该数据保存在new.sql文件中。现在该new.sql文件包含如下数据:
Insert into table1 values (101 ,"a", "xyz123");
Insert into table1 values (102 ,"b", "pqr");
Run Code Online (Sandbox Code Playgroud)
当我使用这样的diff命令时:
diff old.sql new.sql
Run Code Online (Sandbox Code Playgroud)
它给出了逐行差异,但我只想要更新的数据,如 xyz123。
我有三个包含排序数字序列的文件,每行一个:
文件 1
1
2
3
Run Code Online (Sandbox Code Playgroud)
文件 2
1
3
4
Run Code Online (Sandbox Code Playgroud)
文件 3
1
5
Run Code Online (Sandbox Code Playgroud)
我想并排“对齐”这三个文件,如下所示:
file1 file2 file3
1 1 1
2
3 3
4
5
Run Code Online (Sandbox Code Playgroud)
我试过,sdiff但它只适用于 2 个文件
说我有两个文件:a.txt和b.txt.
内容a.txt:
hello world
Run Code Online (Sandbox Code Playgroud)
内容b.txt:
hello world
something else
Run Code Online (Sandbox Code Playgroud)
当然我可以用它vimdiff来检查它们的区别,我可以确保它a.txt是 的一个子集b.txt,这意味着它b.txt必须包含 中存在的所有行a.txt(就像上面的例子一样)。
我的问题是如何将存在b.txt但不存在的行记录a.txt到文件中?