Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Как подобрать суффикс для переименования в rsync -ab --suffix= ?  (Прочитано 1686 раз)

0 Пользователей и 1 Гость просматривают эту тему.

adawdp

  • Автор темы
  • Гость
2016 Aug 14; 03:35 PM; Oakville, ON, Canada.

— Есть необходимость собрать (скопировать) в одну директорию все файлы pdf из другой директории с поддиректориями.
— Делаю так:
Код: (bash) [Выделить]
find . -iname "*.pdf" -type f -print0 | xargs -0 -I '{}' /usr/bin/rsync -ab --suffix=_`date +%Y%b%d%H%M%S%N` "{}" /home/fjf/16Aug14— Но если файл с одним и тем же именем повторяется в исходной директории более двух раз то естественно происходит переписывание  :'( … Быстро это всё работает или время назначается для всех переименованных файлов одно и то же.
— Какой-то другой суффикс наверное надо типа счётчика что ли, я не программист быстро придумать ничего не могу, подскажите что можно использовать вместо даты?

Punko

  • Автор темы
  • Гость
adawdp, может быть, подойдёт время? Или дата + случайное число?

Вообще, мне кажется это в разработку надо - быстрее ответят. Перенесу.

adawdp

  • Автор темы
  • Гость
2016 Aug 14; 08:27 PM

Punko, время не получается даже с долями секунды …
(Нажмите, чтобы показать/скрыть)
— Скорее всего время вычисляется один раз и не подставляется к каждому файлу новое…
— Экспериментирую 5 директорий по 10 файлов с одинаковыми именами. В итоге «собирается» только 21 файл, т.е. происходит замена.
— Я, конечно, выход нашёл но в несколько ступеней, а хотелось бы иметь решение на будущее из одной команды.

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Код: (bash) [Выделить]
SRC_DIR=''
DEST_DIR=''

IFS=$'\n'
for F in $(find "$SRC_DIR" -type f -iname "*.pdf")
do
        N=2
D="${F%/*}"
        F="${F##*/}"
        B="${F%.*}"
        EXT="${F##*.}"
        DEST_F="${B}.${EXT}"
        while [ -f "$DEST_DIR/$DEST_F" ]
        do
                DEST_F="${B}_${N}.${EXT}"
                ((N+=1))
        done
        mv "$D/$F" "$DEST_DIR/$DEST_F"
done
оно?
« Последнее редактирование: 15 Августа 2016, 06:54:27 от renzrv »

adawdp

  • Автор темы
  • Гость
2016 Aug 14; 10:39 PM

— Спасибо, renzrv, возможно и ОНО, но пока не сработало :)!
— Оформил скриптом:
(Нажмите, чтобы показать/скрыть)
— Запускаю скрипт получаю вот такое:
(Нажмите, чтобы показать/скрыть)
— Возможно где-то ошибка я попробую поискать сам, но не уверен, что получится :)!

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Исправил.

adawdp

  • Автор темы
  • Гость
2016 Aug 14; 11:19 PM

— Тоже, возможно где-то ошибка…
(Нажмите, чтобы показать/скрыть)

— Спасибо, до нашего завтра :)!

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
adawdp, Теперь проверил, исправил)

adawdp

  • Автор темы
  • Гость
2016 Aug 15; 07:44 AM

Renzrv, спасибо, это работает!
(Нажмите, чтобы показать/скрыть)
— Всё остальное можно сделать путём модификации этого скрипта.

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Код: (bash) [Выделить]
#!/bin/bash

HLP='
ОПИСАНИЕ
Скрипт перемещает или копирует все файлы без директорий
из директории источника (если не указана-текущая директория)
в директорию назначения.
Одинаковые имена файлов при перемещении или копировании
в директорию назначения переименовываются добавлением
номера (до точки в расширении).

ИСПОЛЬЗОВАНИЕ
'$0' [-m|-c] -p "ШАБЛОН" -s "ДИРЕКТОРИЯ" "ДИРЕКТОРИЯ"

ПАРАМЕТРЫ
-m Перемещать файлы
-c Копировать файлы
-u Перемещать или копировать только уникальные файлы
(по md5 хешу). Вычисление хешей может занять время.

-p "ШАБЛОН"
Шаблон имен файлов (регистронезависимый)
Например: "*.txt"

-s "ДИРЕКТОРИЯ"
Использовать указанную директорию-источник
вместо текущей.

"ДИРЕКТОРИЯ"
Путь до директории в которую будут перемещатся
или копироватся файлы.
'

[ $# = 0 -o "$1" = "-h" -o "$1" = "-help" ] && { echo "$HLP"; exit; }

SRC_DIR="$PWD"

while getopts cmup:s: f
do
    case "$f" in
        c) CMND=cp ;;
        m) CMND=mv ;;
        u) UNQ="y" ;;
        p) PTRN="-iname \"$OPTARG\"" ;;
        s) SRC_DIR="$OPTARG" ;;
    esac
done

[ "$CMND" ] || { echo "Ошибка: Не выбрано действие: копирование или перемещение." >&2; exit; }

[ -d "$SRC_DIR" ] || { echo "Ошибка: Директория источник: \"$SRC_DIR\" не найдена." >&2; exit; }

DEST_DIR="${!#}"
[ -d "$DEST_DIR" ] || { echo "Ошибка: Директория назначения: \"$DEST_DIR\" не найдена." >&2; exit; }

if [ "$UNQ" ]; then
echo "Вычисление хешей файлов..." >&2
FILES="$(eval find \"$SRC_DIR\" -type f "$PTRN" -exec md5sum {} + | sort -k1 | uniq -w 32 | cut -d ' ' -f3-)"
else
FILES="$(eval find \"$SRC_DIR\" -type f "$PTRN")"
fi

[ $CMND = "cp" ] && echo "Копирование файлов..."  >&2 || echo "Перемещение файлов..." >&2

IFS=$'\n'
for FILE in $FILES
do
        FILE_NAME="${FILE##*/}"
FILE_DIR="${FILE%/*}"

        BASE="${FILE_NAME%.*}"
[ "$BASE" ] || BASE="$FILE_NAME"

[[ "$FILE_NAME" = *.* ]] && EXT=".${FILE_NAME##*.}" || EXT=

        DEST_FILE="${BASE}${EXT}"
ADDED=n
        N=2
        while [ -f "$DEST_DIR/$DEST_FILE" ]
        do
                DEST_FILE="${BASE}_${N}${EXT}"
                ((N+=1))
ADDED=y
        done
[ $ADDED = y ] && echo "\"$FILE_NAME\" > \"$DEST_FILE\" DIR: \"$FILE_DIR\""
        $CMND "$FILE" "$DEST_DIR/$DEST_FILE"
done
echo "Завершено." >&2


1. Cкрипт можно назвать например Mv_cp_to_dir.sh, положить в ~/bin, и добавить права на исполнение.
2. Из любой директории файлы из которой хотите переместить или скопировать куда-то:
указываем параметры и путь куда переместить или скопировать файлы, например:
Mv_cp_to_dir.sh -m "/path/to/dest/dir"Ентер, готово.

Чтобы убрать пробельные отступы добавляемые движком сайта при копировании кода:
sed -i 's/^    //' Mv_cp_to_dir.sh
« Последнее редактирование: 16 Августа 2016, 18:13:42 от renzrv »

adawdp

  • Автор темы
  • Гость
2016 Aug 15; 11:14 PM; Oakville, ON, Canada.

— Спасибо, renzrv, я не знаю почему общественность слабо реагирует, ведь довольно часто,к примеру, приходится собирать фотографии из разных директорий, а фотографии часто фотоаппаратом называются одинаково.
— Я встречал различные частные «однострочники» сбора изображений. Но проблема ведь именно часто в дубликатах, естественно какие-то операции с дубликатами не помешают, если есть время, то сделайте, то о чём Вы написали, я точно оценю :), а заодно может и общественность проснётся :)!

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
Добавил "только уникальные файлы" -опция -u,
добавил сообщения о переименовании имен файлов.
Сообщения о переименовании если их ожидается много можно направить в лог:
Mv_cp_to_dir.sh -c -u "/path/to/dest/dir" > log.txtостальные сообщения скрипта при этом в лог не попадут.
« Последнее редактирование: 16 Августа 2016, 18:17:17 от renzrv »

adawdp

  • Автор темы
  • Гость
2016 Aug 17; 07:44 AM; Oakville, ON, Canada.

— Я думаю, renzrv, что вопрос исчерпан, можно даже сказать ниже дна :), исходя из поставленной задачи, естественно!
— Ещё раз спасибо, буду рекомендовать к использованию!

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
adawdp, Вот более быстый и простой вариант без скриптов, баш циклов, проверок, и т.д
Минус только в том, что ко всем именам файлов в конечной директории добавляется номер:
DEST_DIR=''; \
find "$PWD" -type f \
| sed -rn 's|^(.*/)([^/]+)$|\2/\1\2|p' \
| sort -t/ -k1 | cut -d/ -f2- | nl \
| sed -rn "s|^\s*([0-9]+)\s*(.+/)([^/]+)$|\2\3\n$DEST_DIR/\1 \3|p" \
| xargs -d '\n' -L2 -n2 cp
В find'е после (-type f) можно добавить шаблон имени (-name "" или -iname "")
cp в конце (копирование) можно заменить на mv (перемещение)
Конечная директория DEST_DIR желательно должна быть пустой.

Вариант "только уникальные файлы":
DEST_DIR=''; \
find "$PWD" -type f -exec md5sum {} + \
| sort -k1 | uniq -w 32 | cut -d ' ' -f3- \
| sed -rn 's|^(.*/)([^/]+)$|\2/\1\2|p' \
| sort -t/ -k1 | cut -d/ -f2- | nl \
| sed -rn "s|^\s*([0-9]+)\s*(.+/)([^/]+)$|\2\3\n$DEST_DIR/\1 \3|p" \
| xargs -d '\n' -L2 -n2 cp
« Последнее редактирование: 29 Октября 2016, 16:33:18 от renzrv »

 

Страница сгенерирована за 0.071 секунд. Запросов: 25.