![cp 命令不会覆盖现有文件](https://linux22.com/image/96787/cp%20%E5%91%BD%E4%BB%A4%E4%B8%8D%E4%BC%9A%E8%A6%86%E7%9B%96%E7%8E%B0%E6%9C%89%E6%96%87%E4%BB%B6.png)
我正在将文件从 git 存储库复制到虚拟主机文件夹中,但以下命令都不会覆盖现有文件:
sudo cp -R /home/git/repo /var/www/website
sudo cp -R -f /home/git/repo /var/www/website
如何确保该cp
命令覆盖现有文件?
编辑:快速测试,将文件从 webdir 复制到存储库确实会覆盖文件,因此显然某些东西 ( www-data?
) 正在锁定 webdir 中的文件。输出mount
:
~$ mount | column -t
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=1005964k,nr_inodes=251491,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=204840k,mode=755)
/dev/vda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=27,pgrp=1,timeout=0,minproto=5,maxproto=5,direct)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
mqueue on /dev/mqueue type mqueue (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=204840k,mode=700,uid=1000,gid=1000)
和:
df -h /var/www
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 30G 20G 8.9G 69% /
答案1
而不是cp
我更喜欢用于tar
大树..
是的,我几乎从不使用cp -r
语法(除了硬链接备份,使用cp -al
,但它非常具体)。
tar 的语法确实允许复制大树的许多最佳配置,有关可以复制或不复制的内容(哪些文件、权限、所有者...)请参阅man tar
。
我更喜欢熟悉tar
命令:
在本地主机上:
tar -cpC /path/to/source . | tar -xpC /path/to/target
.
(注意指定的点要保存什么)。
熟悉tar
可能对远程复制有用:
ssh user@remotesource tar -zcpC /path/to/source . | tar -zxpC /path/to/target
或者
tar -zcpC /path/to/source . | ssh user@targethost tar -zxpC /path/to/target
甚至
ssh user@remotesource tar -zcpC /path/to/source . |
ssh user@targethost tar -zxpC /path/to/target
在远程和/或不同的主机上,在复制用户帐户时,您可能喜欢--numeric-owner
选项...
--one-file-system
保留在本地文件系统中--overwrite
覆盖现有文件-T, --files-from FILE
获取要从 FILE 中提取或创建的名称-z
使用gzip压缩
而不是tar
,为什么不使用cpio
作为imz——伊万·扎哈里亚切夫注释掉,cpio
可以做同样的事情,但语法不同:
cpio
需要必须存储在的 inode 列表(文件、目录、dev、socket、fifo)档案提交人STDIN
。
但cpio
提供一种模式--pass-through
允许您将文件复制到另一个目录。
这使得语法更强大,但是当我们用来find
构建这个列表时,我们可以使用 of 的功能find
来准确复制我们需要的内容:
cd /path/to/source
find . \( -type f -o -type d \) ! -name '*.foo' -print0 |
cpio --null -pvd /path/to/destination
远程使用,您可以:
ssh user@remotesource /bin/sh <<<'cd /path/to/source;
find . \( -type f -o -type d \) ! -name '*.foo' -print0 |
cpio --null -o |
gzip' |
ssh user@targethost 'cd /path/to/destination && gunzip | cpio -id'
答案2
由于您以 root 身份运行此程序(使用),因此您是否检查过root或中sudo
是否有别名?就像是:cp
.bashrc
.profile
alias cp="cp -i"
尝试使用“ ”运行命令\
,如下所示:
sudo \cp -R /home/git/repo /var/www/website
in将在没有任何别名的\
情况下运行。\cp
cp
答案3
听起来您希望文件以 结尾/var/www/website/index.html
,但使用上述语法,它们将以/var/www/website/repo/index.html
.
您可以通过检查是否有/var/www/website/repo/
包含新文件的目录来验证这是否确实发生。
解决方案是使用类似cp -R source/* dest/
, 或者 a 的东西rsync -a source/ dest/
来提高效率。
答案4
我建议尝试一下sudo cp -Rf /home/git/repo/* /var/www/website
,在复制目录而不是目录的内容时,我自己总是运气更好。