树命令:您能避免对最终项目的格式依赖吗?

树命令:您能避免对最终项目的格式依赖吗?

我正在使用treediff来比较本地目录与同一目录的 USB 备份版本,并识别值得注意/可丢弃的差异。

$ cd home/dir/
$ tree --charset=ascii -af . > ~/tree__local

$ cd {usb}/home/dir/
$ tree --charset=ascii -af . > ~/tree__usb

$ diff ~/tree__local ~/tree__usb > ~/diff-analysis.txt

但我注意到树有留下最后一项的父分支的习惯……呃,这很难用语言描述:

$ tree --charset=ascii -af .
.
|-- ./bar
|   |-- ./bar/babushka
|   |-- ./bar/galeda
|   `-- ./bar/helga
`-- ./foo
    |-- ./foo/alpha
    |-- ./foo/beta
    `-- ./foo/gamma

8 directories, 0 files

# add a new final item.
$ touch zebra

# same command.
$ tree --charset=ascii -af .
.
|-- ./bar
|   |-- ./bar/babushka
|   |-- ./bar/galeda
|   `-- ./bar/helga
|-- ./foo
|   |-- ./foo/alpha
|   |-- ./foo/beta
|   `-- ./foo/gamma
`-- ./zebra

8 directories, 1 file

请注意 foo/ 中的文件如何获得额外的管道分支。该diff命令将这些标记为差异,即使文件本身实际上根本没有不同。

这是非常对于我的目的而言不是最佳的。你们知道如何规避或防止这种情况吗?你能把同质的支管一直压下去吗?该tree手册没有提及格式化“最后”或“最终”项目。

答案1

的输出tree用于显示目的,对于解析不太有用。

直接比较两个目录层次结构会更好。您可以这样做,rsync例如:

rsync --dry-run --archive --delete --itemize-changes home/dir/ "$usb_path"/home/dir/

(包括--dry-run,或该选项的简短变体,-n,是很重要.)

该命令将准确地告诉您本地目录和 USB 设备上的目录之间的区别。当我们使用该选项运行时,磁盘上不会发生任何更改--dry-run。该--itemize-changes选项为要rsync复制或删除的每个文件或目录输出一个简洁的状态字符串,编码同步的原因。

添加--omit-dir-times到选项列表的末尾以避免列出时间戳不同的目录。添加--ignore-existing以使其忽略两个位置都存在的文件,即使它们的大小或元数据不同。将这两个额外选项添加到上面的命令中后,您将期望看到前缀为的输出行

  • *deleting,对于从本地目录中删除但未从 USB 设备中删除的内容,
  • cd+++++++++,对于添加到本地目录的目录,或者
  • >f+++++++++,对于添加到本地目录的文件。

答案2

我想您可以摆脱完整的缩进和分支格式,以便更好地使用diff

-i
使树不打印缩进线,与 -f 选项结合使用时很有用。与 -J 或 -x 选项一起使用时,还会删除尽可能多的空格。

$ tree --charset=ascii -afi .
.
./bar
./bar/babushka
./bar/galeda
./bar/helga
./foo
./foo/alpha
./foo/beta
./foo/gamma
./zebra

8 directories, 1 file

太糟糕了:缩进帮助我更快地从视觉上理解这些东西。但是哦,好吧……

答案3

在每一行中,将第一行之前的所有内容都转换.为空格:

tree --charset=ascii -af . | awk 'BEGIN{FS=OFS="."} {gsub(/./, " ", $1)} 1'

相关内容