我正在尝试编写一个bash脚本,它可以在2个或更多目录位置之间按名称提供相同文件的列表
diff -srq Ear2.ear/ Ear1.ear/ | grep identical
但似乎这也在比较内容。
我已经有一个文件,其中包含我需要比较的所有目标目录的列表。但是,我需要在比较时排除某些子指挥。
答案 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)
cd
以便我们不在find
的输出中包含父目录。find
以打印所有文件,不包括给定的子文件夹。sort
,以便我们comm
实用程序仅显示共同的行(即文件名)。基本示例:
我有文件夹结构:
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。