从文件列表

时间:2016-09-25 14:17:49

标签: linux bash testing copy diff

我一直在网上搜索.sh脚本来执行此操作,但我找不到任何内容。

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

现在我想创建一个脚本文件,它将获取文件列表并执行以下测试: - 如果目标文件不存在,请复制该文件。 - 如果文件存在于目的地且与来源相同,则不要进行任何操作。 - 如果文件存在于目的地且与来源不同,请将其复制并将其更改为.new

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

# 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

希望有人可以指出我正确的道路,或者提供一个可以完成我正在寻找的脚本。

此致

1 个答案:

答案 0 :(得分:0)

在我看来,您可能需要使用git等工具。然后,您可以在从另一个存储库中提取/合并之前使用两个存储库并检查提交。

如果你坚持以与你描述的方式类似的方式进行,那么这是一个小的bash脚本。它只需一步即可完成所有操作,即不会生成包含要复制的文件列表的临时文件,它只是查找源目录中的所有新/已更改文件并将它们复制到目标目录,添加{{1}必要时加上后缀。

.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 来确定两个文件是否相同。这意味着如果涉及的文件很大,它可能会很慢,因为它可能必须读取整个文件。但它应该适用于小配置文件。当然,这是一个shell脚本,如果你调用外部程序时有很多文件,它可能会很慢。