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