使用Shell脚本搜索文件名

时间:2016-01-25 03:53:35

标签: shell

我正在尝试在两个目录之间搜索具有相同名称的文件集

**dir1** (/MyFolder/sample/test1)                     
file1.txt                   
file2.txt                   
file3.txt
file4.txt

**dir2** (/MyFolder/sample/test2)
file1.txt
file4.txt

我正在以下列方式使用 diff 命令

diff -sr /MyFolder/sample/test1/ /MyFolder/sample/test2/ | awk -F: '{print $1}' | grep -r ".txt"

结果如下:

Files /MyFolder/sample/test1/file1.txt and /MyFolder/sample/test2/file1.txt are identical
Files /MyFolder/sample/test1/file4.txt and /MyFolder/sample/test2/file4.txt are identical

我正在寻找的结果只是文件名:

file1.txt
file4.txt

任何帮助表示赞赏!!

2 个答案:

答案 0 :(得分:3)

稍微摆弄ls& grep也应该工作:

ls dir1 | grep "`ls dir2`"

或者,如果它是C Shell:

ls dir1 | grep -E "`ls dir2 | tr '\n' '|'` "

正如 radical7 所观察到的那样,第一种方法在C shell中不起作用,因为新行在传递给grep时会丢失。对于这种情况,我们可以使用正则表达式。

grep -E或简称egrep允许我们使用file1.txt|file2.txt形式的正则表达式作为模式。

另外,请注意最后的空白是有意的。

答案 1 :(得分:0)

这是一个(希望)简单易懂的方法,使用一些本地文件:

cd /MyFolder/sample
( cd test1 ; ls -1 * ) > test1-files
( cd test2 ; ls -1 * ) > test2-files
comm -12 test1-files test2-files

comm命令将采用两个已排序的文件(在这种情况下ls为我们执行,否则您需要sort),并输出三列:专有的行第一个文件,第二个文件中的行,以及两个文件中的匹配行。要将输出限制为您要求的输出,-12命令上的comm会抑制前两列。

但是,如果您希望在没有临时文件的情况下完成所有这些操作,则可以使用以下管道序列:

(cd test1 ; ls -1 ; cd ../test2 ; ls -1) | sort | uniq -c | grep -v "1 " | awk '{ print $2; }'

如果您不熟悉括号内的命令构造,它会在子shell中执行文件,将输出聚合到stdin以沿管道链传递。

实际上,您可以嵌套命令:

((cd test1 ; ls -1) ; (cd test2 ; ls -1)) | ...

请注意,原始示例中没有cd ../test2。当子shell退出时,您将返回到您开始的目录。