将当前目录下的所有内容备份到当前目录下的子目录中,如果不存在则创建该子目录

将当前目录下的所有内容备份到当前目录下的子目录中,如果不存在则创建该子目录

现在,我有以下命令将当前目录的所有内容复制到子目录,前提是提前创建了子目录:

cp -p !($PWD/bakfiles2) bakfiles2/

但我有时必须访问那些我以前从未访问过的文件夹,因此子目录“bakfiles2”可能不存在,我可以以某种方式创建具有当前时间戳的备份目录(以避免与任何现有目录冲突),使用单个复制命令或 bash 脚本时会飞吗?

如果脚本可以忽略以特定模式开头的任何子目录,然后可以为backup目录名称保留该模式,那就太好了_bak_*笔记:* 表示任意数量的任意字符)。

答案1

cp如果在处理时不存在,命令没有创建目标目录的选项,但您可以通过脚本来实现。

或者只需使用rsync可以创建目标目录(如果仅在最后一级不存在)的命令。

rsync -rv --exclude='_bak_*/' /path/in/source/ /path/to/destination
  • 请注意,导入//path/in/source/阻止复制源目录本身并添加--exclude选项以不同步具有匹配名称的目录。

答案2

date您可以使用以下命令获取当前时间戳

date +'%Y%m%d_%H%M%S'

您只能将目录的内容复制到已存在的目录,除非您使用递归复制。但是,除非您希望将以前的备份目录也复制到新的备份目录,否则不能使用递归复制。

所以这必须通过几个步骤来完成

backup_dir="_bak_$(date +'%Y%m%d_%H%M%S')"
mkdir "$backup_dir"
cp -p !(_bak_*) "$backup_dir/"

请记住,正如所写的,这不会复制点文件(以字符开头的文件.),因为这些文件通常由 shell 进行特殊处理。 (您可能需要考虑命名您的备份目录,.bak_*而不是_bak_*从此功能中受益。然后您可以cp -p * "$backup_dir/"

没有理由不能将其创建为一个小函数或脚本,因此它仍然只是一个命令。

相关内容