例子
假設我有 2 個目錄a/
和b/
.假設它們包含以下文件:
a/
a/foo/1
a/bar/2
a/baz/3
b/
b/foo/1
b/bar/2
使得a/foo/1
和b/foo/1
相同但a/bar/2
不同b/bar/2
。
a/
合併到後b/
,我想得到:
a/
a/bar/2
b/
b/foo/1
b/bar/2
b/baz/3
解釋
a/foo/
和b/foo/
(遞歸地)相同,所以我們刪除a/foo/
.a/bar/2
和b/bar/2
不同,所以我們什麼都不做。a/baz/
只存在於 中a/
但不存在於 中b/
,因此我們將其移至b/baz/
。
有現成的 shell 指令嗎?我有一種感覺,rsync
可能有用,但我不熟悉rsync
。
答案1
不能說我知道可以為您執行此操作的特定命令。但您可以僅使用散列來完成此操作。
下面是一個簡單的例子:
#!/bin/bash
# ...some stuff to get the files...
# Get hashes for all source paths
for srcFile in "${srcFileList[@]}"
do
srcHashList+="$(md5sum "$srcFile")"
done
# Get hashes for all destination paths
for dstFile in "${dstFileList[@]}"
do
dstHashList+="$(md5sum "$dstFile")"
done
# Compare hashes, exclude identical files, regardless of their path.
for srci in "${!srcHashList[@]}"
do
for dsti in "${!dstHashList[@]}"
do
match=0
if [ "${srcHashList[$srci]}" == "${dstHashList[$dsti]}" ]
then
match=1
fi
if [ $match != 1 ]
then
newSrcList+=${srcFileList[$srci]}
newDstList+=${dstFileList[$dsti]}
fi
done
done
# ...move files after based on the new lists
這絕對可以做得更乾淨,特別是如果您只關心彼此路徑相同的檔案。也可能在線性時間內完成,但整體概念是可行的。