尝试仅复制最近一天内更改的文件,同时保持文件夹结构

尝试仅复制最近一天内更改的文件,同时保持文件夹结构

我正在尝试查找并复制最近一天内修改过的文件。在这样做的同时,我尝试维护dir1.dir1其中有许多子目录和数据文件。

以下是我目前拼凑起来的内容,但显然mtime如果文件内容更新,目录中的内容不会更新。此外,我相信这个 cp 命令将复制目录中的所有文件,而不仅仅是那些已更改的文件。

find /NAS/data/dir1 -type d -mtime -1 -exec cp -at /mnt/databackup/dir1 {} +

如果我使用-type f它就不会保留文件夹结构。

答案1

您可以将find ... -type f, 与 bash for 循环一起使用。在循环中,使用mkdir -p和的组合dirname可以让您重新创建文件夹结构,然后再使用 cp 简单地复制每个文件。

#!/bin/bash

dirA="/NAS/data/dir1/"
dirB="/mnt/databackup/dir1/"
while read -r file
do
    relative="${file##"$dirA"}"
    newfile="$dirB$relative"
    echo mkdir -p "$(dirname "$file")"
    echo cp -at "$file" "$newfile"
done < <(find "$dirA" -type f -mtime -1)
  • read是 bash 内置函数。它通常用于-r避免一些边缘情况问题。它从它的 .txt 文件中(一次)读取一行stdin。在这里,这stdin是 的输出find
  • ${var##string-to-remove}是一种形式参数替换
  • newfile="$dirB$relative"。这是一个经典的 bash 连接
  • $()。这个 bash 构造称为命令替换
  • mkdir -p根据需要创建一个目录及其所有祖先
  • cmd < file这是一个经典的重定向
  • <(cmd)这就是所谓的流程替代。它将文件名替换为命令的 stdin [ >()] 或 stdout [ <()] 的句柄。

你可以使用explainshell.com以获得更详细的解释。

相关内容