Максимальный размер блока зависит от rsync версии протокола.
С версией протокола меньше чем 30 макс. было 1 << 29
, т.е. 536 870 912 байтов (512M). Но с версией протокола 30 или выше, макс. 1 << 17
, который является 128k байтами. Таким образом, необходимо будет использовать более старую версию, если Вы захотите большие размеры блока.
Источник: rsync.h
#define MAX_BLOCK_SIZE ((int32)1 << 17)
/* For compatibility with older rsyncs */
#define OLD_MAX_BLOCK_SIZE ((int32)1 << 29)
И: io.c
// ...
int32 max_blength = protocol_version < 30 ? OLD_MAX_BLOCK_SIZE : MAX_BLOCK_SIZE;
// ...
if (sum->blength < 0 || sum->blength > max_blength) {
rprintf(FERROR, "Invalid block length %ld [%s]\n",
(long)sum->blength, who_am_i());
Существует - я считаю крутым - программное обеспечение под названием perl-rename
, в котором вы можете выполнить свою задачу так просто, как:
perl-rename 's/^(.*)_.*AUG2014.*/AZ-2014-08-$1.pdf/' *.pdf
HTH, Ура,
Что ж, вот что я сделал с GNU tar
:
mkdir test; cd test
eval "set -- $(i=
for m in JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
do touch 2313_ABCDE${m}2014_PQRST_0_.pdf \
3244_ABCDE${m}2014_PQRST_0_.pdf \
4234_ABCDE${m}2014_PQRST_0_.pdf
printf " %s's/\([0-9]*\)_.*$m\(20..\)_.*\./AZ-\\\\2-%02d-\\\\1./'" \
--xform= $((i=$i+1))
done)"
mkdir -p ../new
tar -c . "$@" | tar -C../new -x
Очевидно, вам не понадобится mkdir test
или touch .. \ .. \. .
частей, но я сделал их, чтобы проверить этот ответ. Вы можете увидеть результаты этих двух здесь:
ls -m
2313_ABCDEAPR2014_PQRST_0_.pdf, 2313_ABCDEAUG2014_PQRST_0_.pdf,
2313_ABCDEDEC2014_PQRST_0_.pdf, 2313_ABCDEFEB2014_PQRST_0_.pdf,
2313_ABCDEJAN2014_PQRST_0_.pdf, 2313_ABCDEJUL2014_PQRST_0_.pdf,
2313_ABCDEJUN2014_PQRST_0_.pdf, 2313_ABCDEMAR2014_PQRST_0_.pdf,
2313_ABCDEMAY2014_PQRST_0_.pdf, 2313_ABCDENOV2014_PQRST_0_.pdf,
2313_ABCDEOCT2014_PQRST_0_.pdf, 2313_ABCDESEP2014_PQRST_0_.pdf,
3244_ABCDEAPR2014_PQRST_0_.pdf, 3244_ABCDEAUG2014_PQRST_0_.pdf,
#...and so on
Но есть также ...
ls -m ../new
AZ-2014-01-2313.pdf, AZ-2014-01-3244.pdf, AZ-2014-01-4234.pdf,
AZ-2014-02-2313.pdf, AZ-2014-02-3244.pdf, AZ-2014-02-4234.pdf,
AZ-2014-03-2313.pdf, AZ-2014-03-3244.pdf, AZ-2014-03-4234.pdf,
AZ-2014-04-2313.pdf, AZ-2014-04-3244.pdf, AZ-2014-04-4234.pdf,
AZ-2014-05-2313.pdf, AZ-2014-05-3244.pdf, AZ-2014-05-4234.pdf,
AZ-2014-06-2313.pdf, AZ-2014-06-3244.pdf, AZ-2014-06-4234.pdf,
AZ-2014-07-2313.pdf, AZ-2014-07-3244.pdf, AZ-2014-07-4234.pdf,
AZ-2014-08-2313.pdf, AZ-2014-08-3244.pdf, AZ-2014-08-4234.pdf,
AZ-2014-09-2313.pdf, AZ-2014-09-3244.pdf, AZ-2014-09-4234.pdf,
AZ-2014-10-2313.pdf, AZ-2014-10-3244.pdf, AZ-2014-10-4234.pdf,
AZ-2014-11-2313.pdf, AZ-2014-11-3244.pdf, AZ-2014-11-4234.pdf,
AZ-2014-12-2313.pdf, AZ-2014-12-3244.pdf, AZ-2014-12-4234.pdf
Как вы можете видеть, он изменил все файлы, которые я создал, в соответствии с вашими требованиями. Теперь, сделав это, я доволен, и поэтому я сделаю это:
rm *; mv ../new/* ./; rmdir ../new
И все.
Если имена файлов не содержат ни одной кавычки, ни символов новой строки:
ls | sed -n "s/$/:JAN1FEB2MAR3APR4MAY5JUN6JUL7AUG8SEP9OCT10NOV11DEC12/
s/\(\(.*\)_.*\(...\)\([0-9]\{4\}\)_.*\):.*\3\([0-9]*\).*/mv -i -- '\1' 'AZ-\4-\5-\2.pdf'/p"
Добавьте | sh
для выполнения переименования.
Для этого используется обычный трюк sed
для выполнения перевода (здесь AUG
-> 8
).
Мы добавляем таблицу отображения (здесь JAN1FEB2...
) к концу пространства шаблонов и полагаемся на обратные ссылки (\).*\1\([0-9]*\)
), чтобы сделать поиск вверх. Мы захватываем AUG
в \3
и получаем (в \5
последовательность цифр, следующую за этой \3
в таблице отображения.
Далее будут просмотрены все файлы в формате pdf и скопированы в новый формат имени, оставив оригинальные файлы на месте, чтобы вы могли проверить, как вам нужно.
для файла в $(ls *AUG2014*pdf) ; сделайте newName=$(echo $file | awk -F_ '{ print $1 }') ; cp $file AZ-2014-08-$newName. pdf ; done
ls *AUG2014*pdf
- список всех файлов, содержащих Aug2014, заканчивающийся на pdf
для aString в
- перебираем все элементы в списке, каждый из которых называется aString. Ссылка на aString с использованием символа доллара $. ; выполните некоторое Команда $aString ; done
awk -F_
- разбивает строку на токены согласно "_" делителю. Приведенная выше команда распечатывает первую лексему.
- будьте осторожны, чтобы не было нескольких файлов, начинающихся с одного и того же числа. Если есть, то можно скопировать два файла на одно и то же имя, один перезаписывая другой. Сравните количество старых файлов с количеством новых.
filelist='2313_ABCDEAUG2014_PQRST_0_.pdf 3244_ABCDEAUG2014_PQRST_0_.pdf 4234_ABCDEAUG2014_PQRST_0_.pdf'
for i in $filelist; do
id=$(echo $i|awk -F_ '{print $1}');
mv $i AZ-2014-08-$newname.pdf;
done
У вас может быть другой год или месяц. Если это так, то вам нужно извлечь другие части имени, которые вы хотите сохранить, чтобы построить новое имя.