Использование RSync для копирования последовательного диапазона файлов

Извините, если это не имеет смысла, но я постараюсь дать всю необходимую информацию!

Я хотел бы использовать rsync для копирования ряда последовательно пронумерованных файлов из одной папки в другую.

Я архивирую DCDM (это фильм), и он содержит порядка 600 000 индивидуально пронумерованных последовательных файлов изображений .tif (~ 10 МБ каждый).

Мне нужно разбить это, чтобы правильно заархивировать на ленты LTO6. И я хотел бы использовать rsync для подготовки папок таким образом, чтобы мой простой файл bash .sh мог автоматизировать различные папки и файлы, для которых я хочу создать резервную копию на ленте.

Команда, которую я обычно использую при запуске rsync:

sudo rsync -rvhW --progress --size only <src> <dest>

При необходимости я использую sudo и всегда сначала проверяю результат с помощью --dry-run.

Единственный способ заставить что-то работать (без выбрасывания ошибок) — это использовать подстановочный знак *. Однако это работает только с файлами с установленным шаблоном (например, 01* будет перемещать файлы только из диапазона 010000 - 019999), и мне придется повторить для 02, 03, 04 и т. д..

Я посмотрел в Интернете и изо всех сил пытаюсь найти ответ, который работает.

Это может быть невозможно, и с 600 000 файлов .tif я не могу написать исключение для каждого!

Есть мысли, как (если вообще) это можно сделать?

Оуэн.


person Owen Morgan    schedule 08.09.2014    source источник
comment
Вы можете сопоставить все файлы с самым простым выражением глобуса *. Если это соответствует слишком большому количеству файлов, вам нужно будет сообщить нам, какие еще шаблоны вы хотите исключить, чтобы мы могли помочь вам сократить количество совпадений.   -  person 5gon12eder    schedule 08.09.2014
comment
@ 5gon12eder Хорошо, я новичок в Linux, поэтому не уверен, что такое подстановка...... Что касается файлов, они называются по соглашению «legendary_dcdm_3dXXXXXX.tif» (где X — число)… Я хотел бы переместить, скажем, файлы 20-50K в отдельные файлы, что а) разбивает размер папки таким образом, чтобы она поместилась на ленту LTO6, и б) упрощает восстановление, когда это необходимо...   -  person Owen Morgan    schedule 08.09.2014


Ответы (4)


Подстановка — это функция оболочки для расширения подстановочного знака до списка совпадающих имен файлов. Вы уже использовали его в своем вопросе.

Для следующих пояснений я предполагаю, что мы находимся в каталоге со следующими файлами:

$ ls -l
-rw-r----- 1 5gon12eder staff 0 Sep  8 17:26 file.txt
-rw-r----- 1 5gon12eder staff 0 Sep  8 17:26 funny_cat.jpg
-rw-r----- 1 5gon12eder staff 0 Sep  8 17:26 report_2013-1.pdf
-rw-r----- 1 5gon12eder staff 0 Sep  8 17:26 report_2013-2.pdf
-rw-r----- 1 5gon12eder staff 0 Sep  8 17:26 report_2013-3.pdf
-rw-r----- 1 5gon12eder staff 0 Sep  8 17:26 report_2013-4.pdf
-rw-r----- 1 5gon12eder staff 0 Sep  8 17:26 report_2014-1.pdf
-rw-r----- 1 5gon12eder staff 0 Sep  8 17:26 report_2014-2.pdf

Самый простой случай — сопоставить все файлы. Следующее делает для бедняка ls.

$ echo *
file.txt funny_cat.jpg report_2013-1.pdf report_2013-2.pdf report_2013-3.pdf report_2013-4.pdf report_2014-1.pdf report_2014-2.pdf

Если мы хотим сопоставить все отчеты за 2013 год, мы можем сузить соответствие:

$ echo report_2013-*.pdf
report_2013-1.pdf report_2013-2.pdf report_2013-3.pdf report_2013-4.pdf

Мы могли бы, например, пропустить часть .pdf, но я предпочитаю быть как можно более конкретным.

Вы уже придумали решение, как использовать это для выбора диапазона пронумерованных файлов. Например, мы можем сопоставить отчеты по quater:

$ for q in 1 2 3 4; do echo "$q. quater: " report_*-$q.pdf; done
1. quater:  report_2013-1.pdf report_2014-1.pdf
2. quater:  report_2013-2.pdf report_2014-2.pdf
3. quater:  report_2013-3.pdf
4. quater:  report_2013-4.pdf

Если бы нам было лень набирать 1 2 3 4, мы могли бы вместо этого использовать $(seq 4). Это вызывает программу seq с аргументом 4 и заменяет ее вывод (в данном случае 1 2 3 4).

Теперь вернемся к вашей проблеме: если вам нужны размеры фрагментов, равные 10, вы должны иметь возможность расширить приведенный выше пример в соответствии со своими потребностями.

person 5gon12eder    schedule 08.09.2014
comment
вопрос в том, что происходит, когда я хочу диапазон? Используя ваш пример: я хочу перечислить report_2013-2 и report_2013-3, когда файл содержит 600 000 файлов report_2013.... расширьте это до диапазона 50 000 файлов из этих 600 000 - person Owen Morgan; 08.09.2014
comment
legendary_dcdm_3d45*.tif расширится до legendary_dcdm_3d450000.tiflegendary_dcdm_3d459999.tif. Введите переменную i, которая считает от 00 до 99, и используйте legendary_dcdm_3d$i*.tif внутри цикла. - person 5gon12eder; 08.09.2014
comment
Используя это, для моих нужд работает удовольствие! будучи новичком в оболочке и bash, я не знал, как лучше зациклиться..... c/c++ я мог бы сделать EASY, но не в оболочке/bash. Я все еще заинтригован первым предложением, но, честно говоря, я недостаточно его понял!! - person Owen Morgan; 08.09.2014
comment
Разве это не делает то, что вы хотите? for i in $(seq -w 0 99); do rm -f MANIFEST.$i; for f in legendary_dcdm_3d$i*.tif; do echo $f >> MANIFST.$i; done; done (В текущем каталоге будет создано 100 файлов манифеста, в каждом из которых перечислены файлы в соответствующем диапазоне.) - person 5gon12eder; 08.09.2014
comment
И я не могу не подчеркнуть этого в достаточной мере: Если вы экспериментируете с оболочкой (особенно если вы не уверены), ни в коем случае не вмешивайтесь в свои производственные данные. Или вы можете потерять все это из-за глупой опечатки! - person 5gon12eder; 08.09.2014
comment
да я знаю о чем ты! Я всегда тестирую с параметром -dry-run и держусь подальше от всего, что содержит RM! В данном случае, Legendary: Tomb of the Dragon... в любом случае, DCP были сделаны давным-давно, dcdms не жизненно важны, пока все dcp в безопасности. даже тогда Pro-res Mov полезнее! - person Owen Morgan; 08.09.2014

Вы можете проверить имя файла, начинающееся с цифры, используя шаблон соответствие:

for file in [0-9]*; do
    # do something to $file name that starts with digit
done

Или вы можете включить опцию extglob и перебрать все имена файлов, которые содержат только цифры. Это может устранить любые потенциально нежелательные файлы, которые начинаются с цифры, но содержат нецифровые символы после первого символа.

shopt -s extglob
for file in +([0-9]); do
    # do something to $file name that contains only digits
done
  • +([0-9]) расширяется до одного или нескольких вхождений цифры

Обновлять:

На основе шаблона имени файла в вашем недавнем комментарии:

shopt -s extglob
for file in legendary_dcdm_3d+([0-9]).tif; do
    # do something to $file
done
person John B    schedule 08.09.2014
comment
Вам нужно включить опцию extglob для этого - person hek2mgl; 08.09.2014
comment
Это полезно знать!!! Спасибо, однако, когда я ответил на комментарий, файлы имеют формат: legendary_dcdm_3dXXXXXX.tif, так как же адаптировать это, чтобы учесть тот факт, что есть начало текста? - person Owen Morgan; 08.09.2014
comment
@OwenMorgan Я обновил пост, чтобы имена файлов соответствовали формату, указанному в вашем комментарии. - person John B; 08.09.2014
comment
@JohnB Я в замешательстве........ Я использовал код, который вы написали, добавил rsync -rvhW --progress --size-only $file /000000-050000_test, и ни один tif не был перемещен..... Я использовал следующий диапазон 010000-050000 (начальные 0 появляются в именах файлов - person Owen Morgan; 08.09.2014

старый вопрос, который я знаю, но кто-то может найти это полезным. приведенные выше примеры расширения диапазона также работают с rsync. например, чтобы скопировать файлы, начинающиеся с a, b и c, но не с d и e, из каталога /tmp/from_here в каталог /tmp/to_here:

$ rsync -avv /tmp/from_here/[a-c]* /tmp/to_here
sending incremental file list
delta-transmission disabled for local transfer or --whole-file
alice/
bob/
cedric/
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 89 bytes  received 24 bytes  226.00 bytes/sec
total size is 0  speedup is 0.00
person mulllhausen    schedule 16.07.2015

Если вы записываете на ленты LTO6, вам следует подумать о включении «--inplace» в вашу команду. Inplace предназначен для записи в линейные файловые системы, такие как LTO.

person Jamie Metzger    schedule 21.12.2016