从文件列表创建 .new 文件

Create .new file from filelist

我一直在网上搜索 .sh 脚本来执行此操作,但我没有找到。

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

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

希望有人能为我指明正确的道路或提供一个脚本来满足我的需求。

此致

在我看来,您可能必须使用诸如 git 之类的工具。然后,您可以使用两个存储库并在 pull/merge 来自另一个存储库之前检查提交。

如果您坚持按照您描述的方式进行操作,这里有一个 bash 小脚本可以做到这一点。它一步完成所有事情,即没有生成包含要复制的文件列表的临时文件,它只是在源目录中找到所有 new/changed 文件并将它们复制到目标目录,添加 .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[=10=]' |
    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 脚本,如果你有很多文件,它可能会很慢,因为它会调用外部程序。