在 linux bash 中递归查找一个目录中的文件是否以递归方式存在于另一个目录中并打印存在或不存在

在 linux bash 中递归查找一个目录中的文件是否以递归方式存在于另一个目录中并打印存在或不存在

在 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

相关内容