我正在尝试查找并复制最近一天内修改过的文件。在这样做的同时,我尝试维护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以获得更详细的解释。