在 linux bash 中递归查找一个目录中的文件是否以递归方式存在于另一个目录中并打印存在或不存在
假设你有
pth1/dirA/file1
pth1/dirA/DirB/file2
和pth2/dirA/file1
pth2/dirA/DirB/file3
我想要一份报告
file1 exists
files2 dont exist in pth2
files3 dont exist in pth1
我发现该代码适用于两个目录的当前级别,但我无法使其递归工作取自此处
pth1="/mntA/newpics";
pth2="/mntB/oldpics";
for file in "${pth1}"/*; do
if [[ -f "${pth2}/${file##*/}" ]]; then
echo "$file exists";
fi
done
我怎样才能在两条路径上递归地工作?
答案1
我使用了另一种方法。我在一个目录中找到所有文件,删除它们的路径,然后我可以将结果保存在两个不同的文件中,并将它们与 meld 或其他程序进行比较,或者我可以直接与 meld 比较查找结果。
请注意,我对文件进行排序,只选择唯一文件,而不选择结果中的重复文件。此外,我只对文件名以“jpg”扩展名结尾的文件感兴趣。
pth1="/mnt/oldfiles";
pth2="/mnt/newfiles";
进而
(find "${pth1}"/ -exec basename {} \; | grep "jpg$" | sort | uniq ) > a.txt;
(find "${pth2}"/ -exec basename {} \; | grep "jpg$" | sort | uniq ) > b.txt;
meld a.txt b.txt
或直接
meld <(find "${pth1}"/ -exec basename {} \; | grep "jpg$" | sort | uniq ) <(find "${pth2}"/ -exec basename {} \; | grep "jpg$" | sort | uniq )
更新:如果一个目录比另一个目录大得多,则直接命令不起作用(MILD 会在两个命令未完成的情况下打开)。
答案2
不太清楚你想要什么,但我认为这可以做到。此命令将 下的所有文件/path/1
与 下的文件进行比较/path/2
,检查是否存在和相等性。
diff --brief --recursive /path/1 /path/2
示例
# Create some files
mkdir -p 1/{x,y} 2/{x,z}
touch 1/{x,y}/file1
date | tee 2/x/file1 >2/z/date
# Show what we have
tree 1 2
1
├── x
│ └── file1
└── y
└── file1
2
├── x
│ └── file1
└── z
└── date
4 directories, 4 files
# Compare the two directory trees
diff --brief --recursive 1 2
Files 1/x/file1 and 2/x/file1 differ
Only in 1: y
Only in 2: z