2016-09-25 59 views
0

我一直在搜索整个网络上的.sh脚本来做到这一点,但我没有找到任何。从文件列表创建.new文件

在这一刻,我有一个脚本,它将使用find命令创建一个文件列表。 此文件列表与复制一起使用,以将它们复制到另一个文件夹,并且一切正常。

现在我想创建一个脚本文件,它将接收文件列表并执行以下测试: - 如果文件在目标上不存在,请复制该文件。 - 如果文件存在于目标上并且与源文件相同,则不要执行任何操作。 - 如果文件存在于目标,它是从源头不同,将它复制并改变它的扩展。新

这是将创建文件列表中的脚本:

# File source to copy text files 
find /home/repo/source -type f -name '*.txt' -o -name '*.cfg' -o -name '*.doc' -o -name '*.lst' -o -name '*.inf' -o -name '*.xml' > ../copy-from.txt 
sed -i 's/ /\\ /g' ../copy-from.txt 

# File destination to copy text files 
find . -type f -name '*.txt' -o -name '*.cfg' -o -name '*.doc' -o -name '*.lst' -o -name '*.inf' -o -name '*.xml' > ../copy-to.txt 
sed -i 's/ /\\ /g' ../copy-to.txt 
sed -i 's/\(.\{2\}\)//' ../copy-to.txt 

# Merge source and destination files and add cp command 
paste ../copy-from.txt ../copy-to.txt > ../copy.sh 
rm ../copy-from.txt ../copy-to.txt 
sed -i 's/^/cp /' ../copy.sh 

希望有人能指向正确的路径或提供一个脚本,将做我正在寻找的。

问候

+0

肯定叫做'rsync'? –

+0

我看了rsync,我看不出rsync如何创建.new文件,如果他们更新。 – Webix

+0

重要说明:我希望脚本创建.new文件,而不是覆盖现有的文件。 – Webix

回答

0

在我看来,你可能需要使用的工具,如git。然后,您可以使用两个存储库并检查提交,然后从其他存储库中进行提取/合并。

如果你坚持以类似于你描述的方式去做,这里有一个小小的bash脚本。它在一个步骤中完成所有工作,即不生成包含待复制文件列表的临时文件,它只是在源目录中找到所有新的/已更改的文件,并将它们复制到目标目录,必要时添加后缀.new

src='/path/to/source/dir' 
dst='/path/to/destination/dir' 
find "$src" -type f \(-name '*.txt' -o -name '*.cfg' -o -name '*.doc' -o -name '*.lst' -o -name '*.inf' -o -name '*.xml' \) -printf '%P\0' | 
    while IFS= read -r -d '' file; do 
     if [[ ! -e "$dst/$file" ]]; then 
      cp -a -- "$src/$file" "$dst/$file" 
     elif ! cmp --silent "$src/$file" "$dst/$file"; then 
      cp -a -- "$src/$file" "$dst/$file.new" 
     fi 
    done 

它使用cmp来判断两个文件是否相同。这意味着如果涉及的文件很大,它可能会很慢,因为它可能必须读取整个文件。对于小配置文件来说应该没问题。当然,这是一个shell脚本,如果你有很多文件,它可能会很慢,因为它调用外部程序。

+0

感谢您的脚本。 实际上,我不想在本地创建一个git仓库进行同步。 当我运行该脚本,我得到这个: '#/home/repo/update.sh /home/repo/update.sh:3号线:$ '\ r':找不到命令 发现: '/ home/repo/sources \ r':没有这样的文件或目录 /home/repo/update。sh:第7行:意外标记附近的语法错误'elif' /home/repo/update.sh:第7行:'elif! cmp --silent“$ src/$ file”“$ d't/$ file”;然后 #' – Webix

+0

你确定你正确地粘贴了该文件吗?看起来,一台Windows机器被卷入并且混乱了换行符。在运行之前将它们转换为unix换行符(LF,而不是CRLF)。有一个方便的命令行程序可以执行所谓的'dos2unix'。 – redneb