现在,我有以下命令将当前目录的所有内容复制到子目录,前提是提前创建了子目录:
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/"
)
没有理由不能将其创建为一个小函数或脚本,因此它仍然只是一个命令。