Рекурсивная, не перезаписывающая копия файла?

21

У меня есть каталог, который содержит кучу других папок, содержащих файлы CoffeeScript / JavaScript. Я могу скомпилировать файлы CoffeeScript в новую папку с той же структурой папок.

Я хочу рекурсивно скопировать все файлы * .js из исходной папки в папку назначения. Я также не хочу перезаписывать файлы, которые уже присутствуют в папке назначения. Есть мысли о том, как этого добиться?

Я попытался использовать cp -n source/**.js desination/и, cp -Rn source/**.js desination/посмотрев на другой подобный вопрос, но, похоже, он не работает.

Есть идеи, как этого добиться?

AlbertEngelB
источник
Вы смотрели на rsync?
боноб
@bonob У меня нет нет. Я использовал его один или два раза, но только для удаленного получения файлов.
AlbertEngelB

Ответы:

25

Вы можете использовать rsync (он также делает локальное копирование)

rsync -r --ignore-existing --include=*/ --include=*.js --exclude=* source/ destination
  • -r переходить в каталоги,
  • --ignore-existing игнорировать существующие файлы в месте назначения,
  • includeи excludeфильтрует средний: включает в себя все каталоги, включают в себя все * .js файлы, исключить остальные; первое включение необходимо, в противном случае окончательное исключение также исключит каталоги до сканирования их содержимого.

Наконец, вы можете добавить, -Pесли вы хотите наблюдать за прогрессом, a, --list-onlyесли вы хотите увидеть, что он будет копировать без фактического копирования, и a, -tесли вы хотите сохранить метки времени.


Это не связано, но я недавно узнал команду rsync, когда переместил 15-летние документы из одного раздела в другой. Уверенный, что мои файлы были там, я тогда стер старый раздел и поместил туда другие вещи; Позже я понял, что потерял все метки времени, и обнаружил флаг -t. Просто хотел поделиться своим несчастьем: '(

bonob
источник
Ха-ха, этот работал! rsyncпо-видимому, это бомба.
AlbertEngelB
3
Да, я едва знаю это, но многое узнал об этом, пытаясь ответить на ваш вопрос. Если вам нужно пойти дальше в будущем, вы можете определить сложные фильтры в файлах и вызвать их, например, в команде. Вы также можете использовать фильтры для отдельных каталогов, сжимать данные при копировании, и это только поверхностно!
Bonob
7

Это также достижимо с помощью cp. Посмотреть здесь:

sudo cp -vnpr /xxx/* /yyy

ххх = источник

гггг = пункт назначения

v = многословный

n = нет клоббера (без перезаписи)

p = сохранить права

r = рекурсивный

SEMbyotic
источник
5

Глядя на страницы руководства, кажется, что вы хотите -nвариант.

-n, --no-clobber
   do not overwrite an existing file (overrides the previous -i option)
тантал
источник
Я пытался использовать -n, однако он не позволяет мне фильтровать файлы * .js.
AlbertEngelB
0

В моем дистрибутиве не было клоббера, поэтому:

echo n | cp -vipr xxx yyy

ххх = источник

гггг = пункт назначения

v = многословный

я = интерактивный (запрос перезаписать) | именно поэтому команде предшествует "echo n |"

p = сохранить права

r = рекурсивный

Октавиан
источник