我将一个大文件夹从 Windows 计算机复制到 Linux 计算机,由于某些文件名太大(以及我跳过的一些其他错误),某些文件无法复制。我目前正在两个文件夹之间运行 diff -r,以生成原始文件夹中但不在副本中的文件列表。但是,到目前为止,它似乎唯一能识别的是缺失的文件夹,即它似乎在跳过文件。有没有更好的方法让我进行这种比较?特别是,我担心 Bash 根本无法识别这些文件名太长的文件。
答案1
如果 rsync 是一个可行的选项,那么--itemize-changes
(-i)和--dry-run
选项可能会有用:
rsync -zaic src_dir/ dest_dir/ --dry-run
-z 在传输过程中压缩文件,-a 以存档模式复制,-c 根据校验和而不是修改日期或大小进行文件比较。
-i 将列出不同的单个文件,而 --dry-run 意味着不会传输任何数据,只是生成一个列表。
答案2
你可能会做一些不太一样的事情:
(cd some/where; ls -lR) > somewhere.txt
(cd else/where; ls -lR) > elsewhere.txt
diff somewhere.txt elsewhere.txt
我还没有尝试过,它取决于文件元数据(日期等)的保存(cp -p ...
)以及ls
按相同顺序对文件名进行排序(应该如此)。
答案3
diff --recursive
( -r
) 确实会捕获文件更改,即使在子目录中也是如此。
不过,您可能更愿意使用diff --unified --recursive
。它创建了一个统一diff,显示更改的行,前缀 (+) 表示添加,前缀 (-) 表示删除。方便的是,它还会显示周围的行(即语境),这样您就可以弄清楚那里发生了什么。
答案4
diff <(cd /first/path/ && find ./ | sort) <(cd /second/path/ && find ./ | sort)
这类似于另一个答案但:
- 我用它
find
来生成对象(文件、目录)列表;它更适合这里,ls
因为它的输出只包含路径。 sort
确保对象的相对顺序得以保留,无论每个find
对象的列出顺序如何。- 该
<(…)
语法避免了临时文件bash
。 find
只有在相应操作成功时才会执行cd
,这要归功于操作符。如果任何路径出现拼写错误,&&
这将使您免于在当前目录中运行。find
补充笔记:
- 返回的路径
find
将相对于我们cd
要查找的目录。确保/first/path/
和/second/path/
相互对应。 - 空的输出
diff
表示两个目录相同;但请记住…… - ...该命令仅对路径进行操作,它不会检查内容或元数据是否匹配。
- 带有不寻常字符(例如换行符)的对象名称将破坏逻辑。