Rsync: копіювання лише через часові позначки


42

В даний час у мене є два каталоги A / і B /, які в усіх відношеннях однакові, за винятком часових позначок. Тому якщо я запускаю команду:

rsync --dry-run -crvv A/ B/

тоді всі файли позначаються "uptodate", тоді як команда:

rsync --dry-run -rvv A/ B/

показує, що всі файли повинні бути скопійовані з A / B /.

Моє запитання таке: враховуючи, що я знаю, що файли однакові (щодо вмісту), то чи є спосіб (за допомогою rsync чи іншим чином) встановити часові позначки для файлів у B /, щоб вони були ідентичними часовим позначкам файлів у A /, без копіювання на всі файли з A / B /?

Дякую


Якщо ви знаєте, що файли однакові, то чому ви повинні піти зі свого шляху, щоб не копіювати їх, щоб отримати потрібну позначку дати / часу?
Тім

3
@Tim: можливо, є багато даних.
Річард

Відповіді:


75

Використовуючи -t(зберігайте часові позначки) і --size-onlyпорівнюйте файли лише за розміром. Якщо розмір збігається, rsync не буде копіювати файл, але оскільки -tвін вказаний, він оновить часову позначку у файлі призначення, не повторюючи його.

Не забудьте використовувати -u(оновити), оскільки це пропустить файли, які вже існують, і повністю пропустить оновлення часової позначки.

У мене була проблема спочатку не використовувати rsync для копіювання купи файлів на новий диск, і тому часові позначки були оновлені до поточного часу. Я використав команду нижче, щоб синхронізувати все правильно за пристойну кількість часу:

rsync -vrt --size-only /src /dest

2
Я також пропоную додати --existingдля запобігання випадкових копій нових файлів.
leden

1
Прапор --archive(або -a) включає в себе -r, -tі більше :)
Dor

6

Використання лише --size призведе до того, що rsync може пропустити порівняння часових міток файлів (і, отже, вмісту файлу), якщо розміри збігаються. Поєднавши це з - раз, буде клонувати часові позначки до цільового дерева.


3

Я думаю, що rsync - це правильний інструмент, щоб зробити це, але якщо ви хочете, щоб це зробити якийсь сценарій, а не щось, це може добре почати.

Ви можете отримати список файлів із часовими позначками (кількість разів доступу):

find . -printf '"%p" %a\n' -type f > /tmp/times

І отримайте з нього відповідні команди оновлення часу:

 while read line; do echo touch -a -d \"${line#* }\" ${line%% *}; done < /tmp/times

Це не повний сценарій, але гарне місце для початку! :)


Дякую. Я думаю, що я, напевно, дотримуюся Rsync на даний момент, але я обов'язково вийду в Інтернет і вивчу різні компоненти вашого сценарію, як це може бути корисно в майбутньому.
артіль

Це, здавалося, було саме моїм рішенням! Я хочу зберегти час, додаючи деякі метадані до моєї музичної бібліотеки. Однак, очевидно, він не може обробляти пробіли в іменах файлів):
Burcardo

2

Використовуйте каталог джерела (наприклад /path/to/source) як орієнтир для сенсорної команди. Просто cdдо вашого цільового каталогу і зробіть

find -type f -exec touch -r /path/to/source/{} {} \;

Ви не можете скопіювати часові позначки другої секунди за допомогою rsync (поки що).

Це також працює для каталогів та псевдофайлів (просто видаліть або змініть -type f)


Це було корисно для мене, оскільки мені потрібно було скопіювати atime. Я помітив, що це не копіює ctime, що було нормально в моєму випадку.
snapfractalpop

Просто прочитайте сторінку "touch". За допомогою цієї команди ви можете встановити atime та mtime як.
кнорке

Так, я знаю, що ви можете використовувати, touch -arале це все ще не змінює ctime. Я вважаю, що це рідко хочеться.
snapfractalpop

Ах, я бачу проблему зараз. Дякую. Так, ctime важко змінити, і я не знаю чому.
кнорке

1

Ну, ви, звичайно, можете написати сценарій, який читає часову позначку з одного боку, а потім використовує touch, щоб встановити його в одному файлі з іншого боку.

Але це, ймовірно, займе у вас набагато більше часу, ніж просто дозволити rsync спробувати скопіювати всі файли. Насправді буде передано дуже мало даних (лише блокові хеші, якщо файли справді однакові). Але повний вміст кожного файлу доведеться читати як мінімум з кожного боку. Отже, ви обмежені пропускною здатністю диска або IOPS, це може зайняти деякий час. Але, мабуть, менше часу, ніж написання та тестування сценарію для цього.


Дякую, я не знав про цю особливість rsync (це обговорюється і у вікіпедії).
артіль

0

Для таких людей, як я, які мають намір змінити файли і хочуть зберегти початкову позначку часу (наприклад, ви оновлюєте метатеги вашої музичної бібліотеки).

Він заснований на рішенні, наданому Стоун. Однак тут про час модифікації та робочий сценарій відновлення часових міток. ПЕРШИЙ зробіть перший крок, а потім почніть працювати зі своїми файлами.

  1. Зберегти старі часові позначки . Він працює з поточного каталогу, виключає всі приховані файли та зберігає їх у тимчасовому файлі в /tmp/files. Ви завжди можете змінювати параметри, але краще залишатися з ними, -printf '"%t" "%p"\n'оскільки наступна touchкоманда використовує це.

    find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files

  2. Змініть свої файли скільки завгодно

  3. тепер створіть файл, який допоможе вам відновити часові позначки:

    while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times

  4. І нарешті застосуйте старі дати до модифікованих файлів

    sh job.sh

Caveat: працює для файлів з інтервалом між іменами, спеціальними символами, але, наприклад, без файлів із $знаком у ньому.


Щоб уникнути (деяких) проблем із косою рисою в іменах файлів, використовуйте read -r line. Ну, завжди використовуйте readз -r. Крім того, ви можете уникнути відкриття job.shдля кожного файлу. Просто поставте перенаправлення в кінці команди:while read -r path; do echo touch -a -d $path ; done < /tmp/times > job.sh
hagello

2nd Caveat: Цей скрипт не передає часові позначки каталогів. (Ну, ОП не просили цього.)
hagello

0

Найкращий спосіб скопіювати лише часову позначку в Windows:

Щоб скопіювати останній створений / модифікований / доступний часовий штамп будь-якого файлу до іншого, ви можете використовувати:

touch / c / m / a / r SourceFile DestFile

(Ця версія Touch є частиною консолі Win32 ToolBox http://www.stevemiller.net/apps/ )

Робокопія "SOURCE_DIRECTORY" "DESTINATION_DIRECTORY" / E / COPYALL / DCOPY: DAT / XF . / R: 10 / W: 5 / V / ETA


-1

Посібник з rsync: man rsyncперераховує a -tі -Nперемикач, вони можуть бути вартими.


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