cp 命令不会覆盖现有文件

cp 命令不会覆盖现有文件

我正在将文件从 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将在没有任何别名的\情况下运行。\cpcp

答案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,在复制目录而不是目录的内容时,我自己总是运气更好。

相关内容