您好,我有 2 个目录,它们都包含目录树和文件树。如果可能,我需要一个脚本来验证目录之间的公共文件,如果他找到一个公共文件,我需要在 DIR2 中将其删除并链接到 DIR1。
例子:
该脚本最好使用 bash、awk、sed 或 perl。
谢谢!
$ mkdir -- DIR1/ DIR1/abc1/ DIR1/abc2/ DIR1/abc3/ DIR2/ DIR2/abc1/ DIR2/abc4/
?
$ touch -- DIR1/abc3/a.txt DIR2/abc4/a.txt
?
$ tree
.
??? DIR1
? ??? abc1
? ??? abc2
? ??? abc3
? ??? a.txt
??? DIR2
??? abc1
??? abc4
??? a.txt
7 directories, 2 files
?
Run Code Online (Sandbox Code Playgroud)
没有理由编写脚本文件,有一些命令可以在没有脚本的情况下执行此操作。
该命令diff
将显示差异:
diff -r dir1/ dir2/
Run Code Online (Sandbox Code Playgroud)
( -r
= 递归比较找到的任何子目录,请参阅手册) 将打印仅位于任一目录中的文件列表。
如果您还想检查同名文件的内容是否也相同,那么您应该使用
diff --brief -r dir1/ dir2/
Run Code Online (Sandbox Code Playgroud)
( --brief
= 仅输出文件是否不同)。
如果您还想查看仅存在于一个目录中的文件的差异,将其对应项视为空,您可以使用
diff --brief -Nr dir1/ dir2/
Run Code Online (Sandbox Code Playgroud)
( -N
= 将不存在的文件视为空文件)。
如果要进行操作,命令
cp -Rnl dir1/ dir2/
Run Code Online (Sandbox Code Playgroud)
会为你做的。请注意-R
= 递归复制目录(再次来自手册),而-n
= 不会覆盖现有文件。
您应该能够在 bash 中轻松完成此操作。您正在寻找进行比较的命令是md5sum
or diff
。
例如,下面的脚本仅比较命令行上指定的两个文件的 md5sum:
#!/bin/bash
FILE_A="$1"
FILE_B="$2"
if [ "`md5sum $FILE_A | awk '{print $1}'`" == "`md5sum $FILE_B | awk '{print $1}'`" ] ; then
echo "Same File"
else
echo "Files Differ"
fi
Run Code Online (Sandbox Code Playgroud)
要遍历目录树,您需要使用递归。这是我很久以前编写的一个示例脚本,用于重命名文件名中带有空格的所有文件,以使用下划线而不是空格。
#!/bin/bash
rename 's/\ /_/g' ./*
currentdir=`pwd`
### for all files and directories in the current directory.
for filename in `ls` ; do
### if "filename" is a directory but not a softlink
if [ -d $filename ] && ! [ -h $filename ] ; then
cd "$filename"
$0 ### This causes the script to call itself. Recursion!
cd "$currentdir"
fi
done
Run Code Online (Sandbox Code Playgroud)
然后,要在目录之间创建文件链接,请使用ln -s dir1/File1 dir2/
.
归档时间: |
|
查看次数: |
3945 次 |
最近记录: |