我正在尝试在两个目录之间搜索具有相同名称的文件集
**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
任何帮助表示赞赏!!
答案 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退出时,您将返回到您开始的目录。