如何按名称和2个或多个目录中的相同位置查找相同的文件

时间:2016-03-03 19:43:38

标签: bash

我正在尝试编写一个bash脚本,它可以在2个或更多目录位置之间按名称提供相同文件的列表

diff -srq Ear2.ear/ Ear1.ear/ | grep identical 

但似乎这也在比较内容。

我已经有一个文件,其中包含我需要比较的所有目标目录的列表。但是,我需要在比较时排除某些子指挥。

2 个答案:

答案 0 :(得分:0)

利用find实用程序的-prune选项排除目录:

comm -1 -2 <(cd $1; find . -name "*" -path "./folder1" -prune -o -print | sort) <(cd $2; find . -name "*" -path "./folder1" -prune -o -print | sort)
  1. cd以便我们不在find的输出中包含父目录。
  2. 使用适当的参数运行find以打印所有文件,不包括给定的子文件夹。
  3. 将其导入sort,以便我们
  4. 通过进程替换使用comm实用程序仅显示共同的行(即文件名)。
  5. 基本示例:

    我有文件夹结构:

    diffdir1/
      file1.txt
      file2.txt
      uniqueTo1.txt
      folder1/
        file1.txt
        folder2/
           file1.txt
      folderUniqueTo1/
        file1.txt
    
    diffdir2/
      file1.txt
      file2.txt
      uniqueTo2.txt
      folder1/
        file1.txt
      folder2/
        file1.txt
    

    (各种file1.txt之间的内容确实不同,虽然这里没有检查过。)使用上面的脚本,我得到:

    $ ./script.sh diffdir1 diffdir2
    .
    ./file1.txt
    ./file2.txt
    

    又名只有两个同名文件。

    作为完整性检查,如果我删除了命令的-path "./folder1" -prune -o -print部分,则不应再排除folder1下的内容:

    $ ./script2.sh diffdir1 diffdir2
    .
    ./file1.txt
    ./file2.txt
    ./folder1
    ./folder1/file1.txt
    

    使用文件作为目录列表,这只需要修改find命令的不同参数中的内容。

    示例:排除多个子目录

    此命令将排除文件夹./abc/xyz/obj64./abc/video./sim

    comm -1 -2 <(cd $1; find . -name "*" \( -path "./abc/xyz/obj64" -o -path "./abc/video" -o -path "./sim" \) -prune -o -print | sort) <(cd $2; find . -name "*" \( -path "./abc/xyz/obj64" -o -path "./abc/video" -o -path "./sim" \) -prune -o -print | sort)
    

    请注意,路径列表必须放在\( \)括号内。 -o表示“或”,因此现在正在检查是否有任何路径匹配修剪。

    示例:仅包含与特定模式匹配的文件

    扩展上一个示例,现在让我们只返回与模式匹配的文件。在此示例中,我将仅搜索以.xml结尾的文件:

    comm -1 -2 <(cd $1; find . \( -path "./abc/xyz/obj64" -o -path "./abc/video" -o -path "./sim" \) -prune -o -name "*.xml" -print | sort) <(cd $2; find . \( -path "./abc/xyz/obj64" -o -path "./abc/video" -o -path "./sim" \) -prune -o -name "*.xml" -print | sort)
    

    这里的区别在于修剪后-name参数被移动到。如果您正在搜索所有文件("*"),这没有什么区别,但是当您有模式时这很重要。因此,最好将-name置于最后,以防您以后更改。

答案 1 :(得分:0)

数组横截面将是解决此问题的有趣方法。

 let image:UIImage = UIImage(contentsOfFile: fileName2)!

    image.drawInRect(pdfImagePageRect)

但是,您提到“需要在比较时排除某些子指南”,而您的$ mkdir tmp1 tmp2 $ touch tmp1/foo tmp1/bar tmp1/baz $ touch tmp2/foo tmp2/bar tmp2/slurm $ cd tmp1; a=( * ); cd - $ cd tmp2; declare -A b; for f in *; do b[$f]=1; done; cd - $ for x in "${a[@]}"; do [[ "${b[$x]}" ]] && echo "$x"; done bar foo 包含diff,所以您希望有选择性地选择递归的。

为实现这一目标,我建议使用bash的-r,然后删除你不想要的部分。例如:

globstar

请注意,globstar需要bash版本4。