我正在尝试编写一个 bash 脚本来搜索两个给定的目录,并将给我所有匹配的文件名和每个文件的信息
我不知道从哪里开始,我一直在尝试 diff,find,grep 并且无法使任何工作......任何建议将不胜感激,谢谢。
我确实发现如果我使用 diff -srq testdir1 testdir2 它匹配相同的文件,但是如果一个文件的大小发生变化它不再匹配,我只需要按名称匹配。
你想要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
你可以这样写:
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
,然后遍历该数组以识别两个目录中都存在的那些。
要从 2 个目录中的任何位置递归获取所有匹配的文件名:
find dir1 -type f | xargs basename | xargs -I {} find dir2 -iname "{}"
这将查找 dir1 中的所有文件,从完整路径中选择文件名,然后在 dir2 下搜索该名称。
例如,如果您想搜索某个扩展名,您可以对初始 find 命令使用不同的参数。