本地目录和远程目录的区别

本地目录和远程目录的区别

我想比较我的本地目录和远程目录。

示例:将 2 个目录视为本地目录和远程目录

|-local
|  |--aaa
|  |   |--file1
|  |   |--file2
|  |
|  |--bbb
|  |   |--file1
|  |   |--file2
|  |-file1
|
|-remote
   |--ddd
       |--file1
       |--file2

如果我尝试运行 rsync

rsync -avcn local/ remote/

我得到以下输出

./
file1
aaa/
aaa/file1
aaa/file2
bbb/
bbb/file1
bbb/file2

有没有一种方法,如果本地也缺少所有文件,我只能获取文件夹名称

异常输出:

file1
aaa/
bbb/

这里 file1 和 file2 都出现在“aaa”和“bbb”中,因此只有文件夹名称在输出中可见。

答案1

您可以将命令通过管道传输到以下 awk 脚本中。

$ rsync -avcn local/ remote/ | awk 'BEGIN {prev="./"} substr($0, 0, (length(prev))) != prev {print $0; prev = $0}'
file1
aaa/
bbb/

解释

  • {prev="./"}:在我们开始读取输入之前,将变量设置prev./(这是输出的第一行)。从这里开始,我们将使用此变量来存储前一行的内容。
  • substr($0, 0, (length(prev))):提取substr整行的 ing $0,从第一个字符开始0,长度与前一行一样长(length(prev))
  • != prev:将当前行的子字符串与上一行进行比较。本质上,这测试当前行(子字符串)是否以上一行的字符串开头。我们在这里不使用简单的正则表达式(锚定到行的开头),因为我们必须转义它。
  • {print $0; prev = $0}: 如果当前行从上一行开始,然后忽略它(即不打印它),如果它匹配,那么它是一个新目录,因此打印整行print $0,并将新行存储在prev变量中prev = $0

答案2

我认为,你最好的选择是find <dir> -maxdepth 1 -type d针对两个目录使用,然后比较排序的结果。与 Paul T 的解决方案类似,但有深度限制并且仅考虑目录:

$ cd <local_folder>; find . -type d -maxdepth 1 | sort > ~/local-list.txt
$ cd <remote_folder>; find . -type d -maxdepth 1 | sort > ~/remote-list.txt
$ diff -u ~/remote-list.txt ~/local-list.txt

相关内容