soj*_*oju 9 ls bash diff shell-script
我在编写 bash 脚本时遇到问题
我知道 ls 会列出目录中的文件,但我希望它列出目录 1 但不在目录 2 中的目录,然后列出目录 2 中不在目录 1 中的文件。
在一次微弱的尝试中,我尝试了:
ls -al | diff directory1 directory2
Run Code Online (Sandbox Code Playgroud)
我很快意识到为什么它不起作用。任何人都可以帮助一个彻头彻尾的 bash 书呆子吗?
鉴于 bash,这可能是最简单的
$ comm <(ls -a dir1) <(ls -a dir2)
Run Code Online (Sandbox Code Playgroud)
该<(command)表达式在管道上运行命令并替换/dev/fd引用:
mress:10018 Z$ echo <(ls)
/dev/fd/11
Run Code Online (Sandbox Code Playgroud)
因此,上面的命令ls -a在每个目录上运行,并将它们的输出作为文件参数提供给comm,它输出最多 3 列,制表符缩进:仅在第一列中的条目,在两个中的条目,在第二个中的条目。(也就是说,如果它在两者中,那么它被一个制表符缩进,如果它只在第二个它被 2 个制表符缩进。)你也可以按数字抑制列: comm -1 foo bar只显示第二个文件中的行和行中的行,后者缩进一个制表符。(最常用的方法是抑制除所需列之外的所有列: comm -13 foo bar仅显示共同的行。)
鉴于您想要第一个目录中的那些,这转换为
$ comm -23 <(ls -a dir1) <(ls -a dir2)
Run Code Online (Sandbox Code Playgroud)
如果您需要的不仅仅是它是否存在,请使用diff -r,它将输出共同文件的差异,并为仅在一个或另一个中找到的文件输出一行消息。
如果您更喜欢图形工具,请使用
xxdiff dir1 dir2
Run Code Online (Sandbox Code Playgroud)
您可能需要先安装它。类似的程序有
gtkdiff
tkdiff
Run Code Online (Sandbox Code Playgroud)
午夜指挥官有一个compare directories内置命令,如果您不使用子目录,它会很好用。
| 归档时间: |
|
| 查看次数: |
6217 次 |
| 最近记录: |