假设有一个名为domains
in 的文件夹glassfish
。它有domain1
,domain2
...。domainN
我想从domain1
目录中取出所有内容logs
并将它们保存到/home/user/backup
目录中。
我可以手动执行此操作,
cp -R /home/user/glassfish/domains/domain1 /home/user/backup
rm -rf /home/user/backup/domain1/logs
但我怎样才能更轻松地做到这一点呢?
答案1
您可以使用rsync
代替cp
.除了有一个排除选项外,本地到本地副本的基本相同
rsync --archive --exclude /logs /home/user/glassfish/domains/domain1 /home/user/backup
答案2
您可以使用该cp
命令并排除包含日志的文件夹,!(excluded_folder)
如果您不想使用rsync
或tar
cp -var /home/user/glassfish/domains/domain1/!(/home/user/backup/domain1/logs) /home/user/backup
或者
cp -R /home/user/glassfish/domains/domain1/!(/home/user/backup/domain1/logs) /home/user/backup
如果你想排除更多文件夹,你可以使用|
类似的
!(excluded_folder1|excluded_folder2|excluded_folder3)
确保您的 shell 支持扩展模式匹配(例如,extglob
启用该选项的 Bash)。
如果你想在 bash 脚本中使用它:
#!/bin/bash
shopt -s extglob
cp -var /home/user/glassfish/domains/domain1/!(/home/user/backup/domain1/logs) /home/user/backup
如果您收到类似错误!": event not found"
检查这个帖子:
答案3
您可以使用zip
或tar
来制作存档副本:
cd /home/user/glassfish/domains/domain1
tar --exclude="logs" cvf /home/user/backup/domain1.tar .
等等。或者与zip
:
cd /home/user/glassfish/domains/domain1
zip /home/user/backup/domain1.zip -x logs/**\* .
通过这种方式,您可以根据日期命名档案,这样您就可以在那里保留记录的历史记录。
答案4
如果您不能依赖 shell 语法,您可以使用find
和cpio
传递模式:
find SOURCE \( -depth 1 -name logs -prune \) -o \( -type f -print0 \) |
cpio -p -v -0 -d DESTINATION
以下cpio
选项可能更令人感兴趣(如果您的实现支持它们):
-a
,--reset-access-time
– 读取文件后重置文件的访问时间。
-m
,--preserve-modification-time
– 设置创建的文件的文件修改时间以匹配源中的文件修改时间。
--no-preserve-owner
– 不要尝试恢复文件所有权。这是非 root 用户运行时的默认设置。
-R [user][:][group]
,--owner [user][:][group]
– 设置输出中文件的所有者和/或组。 [...] 该选项只能由超级用户使用。
-u
,--unconditional
– 无条件覆盖现有文件。通常,旧文件不会覆盖磁盘上的新文件。