如何使用bash匹配不同目录下的文件名

时间:2013-09-30 00:09:46

标签: bash shell scripting

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

我不知道从哪里开始,我一直在尝试差异,找到,grep并且无法使任何工作......任何建议都将非常感谢谢谢。

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

3 个答案:

答案 0 :(得分:3)

您想要join

我有两个目录,ab

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下搜索该名称。

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

相关问题