Команда cp не перезаписывает существующие файлы

В конце концов, я использую поиск в каталоге по сценарию здесь с перенаправлением на Vim. Было бы здорово получить что-то подобное напрямую в Geany IDE.

3
23.10.2016, 14:04
5 ответов

Похоже, вы хотите, чтобы файлы попадали в / var / www / website / index .html , но с указанным выше синтаксисом они окажутся в /var/www/website/repo/index.html .

Вы можете проверить, действительно ли это происходит, проверив, есть ли у вас каталог / var / www / website / repo / с новыми файлами.

Решением было бы использовать что-то вроде cp -R source / * dest / или, возможно, rsync -a source / dest / , чтобы быть более эффективным.

1
27.01.2020, 21:13

Я рекомендую попробовать sudo cp -Rf / home / git / repo / * / var / www / website , мне всегда больше везло при копировании содержимого каталогов вместо каталогов.

0
27.01.2020, 21:13

Разрешения и право собственности могут иметь значение для ваших файлов, но если вам ничего не нужно, кроме 644 и 755 , принадлежащих одному владельцу, вы можете просто проверить прямо из Git :

git --git-dir=/home/git/repo/.git --work-tree=/var/www/website checkout -f HEAD

Флаг -f принудительно выполняет проверку, в результате чего Git перезаписывает любые изменения в / var / www / website версией, сохраненной в Git.

HEAD , конечно же, указывает на идею Git о «текущей» фиксации.


Вы также можете изучить команду git worktree , но, поскольку вы не будете выполнять разработку в / var / www / website , приведенное выше вероятно более уместно.

1
27.01.2020, 21:13

Поскольку вы запускаете это от имени root (используя sudo), вы проверили, есть ли псевдоним для cp в .bashrc или .profile? Что-то вроде:

alias cp="cp -i"

Попробуйте запустить команды с '\', например так:

sudo \cp -R /home/git/repo /var/www/website

\ в \cp заставит cp работать без псевдонима.

1
27.01.2020, 21:13

Вместо cp я предпочитаю использовать tar для больших деревьев...

Да, я почти никогда не использую синтаксис cp -r (за исключением жесткой привязки резервных копий, с cp -al, но это очень специфично).

Синтаксис tar допускает много тонких настроек для копирования большого дерева, о том, что может быть скопировано или нет (какие файлы, разрешения, владелец...) смотрите man tar.

Я предпочитаю быть знакомым с командой tar:

На localhost:

 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 (file, dir, dev, socket, fifo), которые должны храниться в archive, чтобы быть переданными STDIN.

Но cpio предлагает режим --pass-through который позволяет копировать файл в другой каталог.

Это делает синтаксис сильнее, но так как мы использовали find для построения этого списка, мы можем использовать возможности 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'
3
27.01.2020, 21:13

Теги

Похожие вопросы