Переименуйте Несколько файлов в Unix

Максимальный размер блока зависит от 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());

5
03.09.2014, 22:13
5 ответов

Существует - я считаю крутым - программное обеспечение под названием perl-rename , в котором вы можете выполнить свою задачу так просто, как:

perl-rename 's/^(.*)_.*AUG2014.*/AZ-2014-08-$1.pdf/' *.pdf

HTH, Ура,

5
27.01.2020, 20:36

Что ж, вот что я сделал с 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

И все.

0
27.01.2020, 20:36

Если имена файлов не содержат ни одной кавычки, ни символов новой строки:

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 в таблице отображения.

2
27.01.2020, 20:36

Далее будут просмотрены все файлы в формате 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 ; done - перебираем все элементы в списке, каждый из которых называется aString. Ссылка на aString с использованием символа доллара $.

awk -F_ - разбивает строку на токены согласно "_" делителю. Приведенная выше команда распечатывает первую лексему.

- будьте осторожны, чтобы не было нескольких файлов, начинающихся с одного и того же числа. Если есть, то можно скопировать два файла на одно и то же имя, один перезаписывая другой. Сравните количество старых файлов с количеством новых.

1
27.01.2020, 20:36
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

У вас может быть другой год или месяц. Если это так, то вам нужно извлечь другие части имени, которые вы хотите сохранить, чтобы построить новое имя.

0
27.01.2020, 20:36

Теги

Похожие вопросы