3

我正在尝试编写一个 bash 脚本来搜索两个给定的目录,并将给我所有匹配的文件名和每个文件的信息

我不知道从哪里开始,我一直在尝试 diff,find,grep 并且无法使任何工作......任何建议将不胜感激,谢谢。

我确实发现如果我使用 diff -srq testdir1 testdir2 它匹配相同的文件,但是如果一个文件的大小发生变化它不再匹配,我只需要按名称匹配。

4

3 回答 3

3

你想要join

我有两个目录a,和b

ls a b
a:
1  2  23 3

b:
1 3 4

join将逐行加入两个(排序的)文件并打印出公共行:

$ join <(ls a) <(ls b)
1
3

加入通过加入每个文件的每一行中的一个字段(字段由制表符和空格字符分隔)来工作。默认情况下,这是第一个字段,但如果不是第一个,您可以指定字段编号。使用它,您可以使用ls -l和添加额外的文件信息:

$ join -1 9 -2 9 <(ls -l a) <(ls -l b)
 total 0 total 0
1 -rw-r--r-- 1 joeuser 5000 0 Sep 29 17:12 -rw-r--r-- 1 joeuser 5000 0 Sep 29 17:12
3 -rw-r--r-- 1 joeuser 5000 0 Sep 29 17:12 -rw-r--r-- 1 joeuser 5000 0 Sep 29 17:12

这将两行合二为一,因此您可以查看有关每个文件的信息(在我的示例中,它们是相同的,因为我同时创建了它们)。

使用此解决方案时,请注意,ls如果文件名中包含非单词字符,则输出并不总是可靠的解析:http: //mywiki.wooledge.org/ParsingLs

于 2013-09-30T00:15:28.593 回答
2

你可以这样写:

cd testdir1
files_in_testdir1=(*)
cd "$OLDPWD"   # return to original directory
for file in "${files_in_testdir1[@]}" ; do
    if [[ -e testdir2/"$file" ]] ; then
        ls -ld testdir1/"$file" testdir2/"$file"
    fi
done

这会填充一个以files_in_testdir1中的文件名列表命名的数组testdir1,然后遍历该数组以识别两个目录中都存在的那些。

于 2013-09-30T04:13:14.010 回答
0

要从 2 个目录中的任何位置递归获取所有匹配的文件名:

find dir1 -type f | xargs basename | xargs -I {} find dir2 -iname "{}" 

这将查找 dir1 中的所有文件,从完整路径中选择文件名,然后在 dir2 下搜索该名称。

例如,如果您想搜索某个扩展名,您可以对初始 find 命令使用不同的参数。

于 2016-11-04T17:16:35.963 回答