Рекурсивна копія файлу, що не перезаписується?


21

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

Що я хочу зробити, - це скопіювати всі * .js файли у вихідну папку в папку призначення рекурсивно. Я також не хочу перезаписувати файли, які вже є в папці призначення. Будь-які думки, як це досягти?

Я спробував використати cp -n source/**.js desination/і cp -Rn source/**.js desination/після перегляду іншого подібного питання, але, схоже, це не працює.

Будь-яка ідея, як це досягти?


У вас був погляд на rsync?
bonob

@bonob Я ні. Я використовував це один-два рази, але лише для віддаленого отримання файлів.
AlbertEngelB

Відповіді:


25

Ви можете використовувати rsync (він також робить локальну копію)

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

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


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


Ха-ха, цей працював! rsyncмабуть, це бомба.
AlbertEngelB

3
Так, я ледве це знаю, але просто дізнався багато про це, намагаючись відповісти на ваше запитання. Якщо вам потрібно буде піти далі, ви можете визначити складні фільтри у файлах і викликати їх, наприклад, у команді. Ви також можете мати фільтри за каталогами, стискати дані при копіюванні, і це просто подряпини по поверхні!
bonob

7

Це також можна досягти за допомогою cp. Дивіться тут:

sudo cp -vnpr /xxx/* /yyy

xxx = джерело

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

v = багатослівний

n = відсутність клоберу (не перезапис)

p = зберегти дозволи

r = рекурсивна


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

xxx = джерело

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

v = багатослівний

i = інтерактивний (запит на перезапис) | саме тому команді передує "echo n |"

p = зберегти дозволи

r = рекурсивна

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.