我想比较我的本地目录和远程目录。
示例:将 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