Как организовать замену дубликатов файлов на симлинки в разных каталогах

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
yamah
Сообщения: 1116
ОС: Rosa Fresh, Debian, RELS

Как организовать замену дубликатов файлов на симлинки в разных каталогах

Сообщение yamah »

Нужна помощь в организации поиска дубликатов файлов.
Отличие от аналогичных тем на форуме:
- Файлы лежат в двух разных, но определенных каталогах (с подкаталогами), находящихся на разных точках мониторования, у которых общим будет только корневой каталог;
- У каждого файла из первого каталога не более одного дубликата файла во втором каталоге;
- В именах подкаталогов первого каталога могут быть пробелы, которые заменять на подчеркивания не хотелось бы;
- Среди файлов из второго каталога могут быть симлинки на файлы из первого;
- Заменить файлы из второго каталога на симлинки аналогичного файла из первого (и не иначе);
- ПО с GUI не подойдет, ибо сервер.

Создавать дополнительные точки монтирования и монтировать туда эти два каталога, что бы прогонять fdupes, не рационально как-то.
Понимание - это меч с тремя кромками: ваша правда, наша правда и Истина.
Жизнь - игра: сюжет задуман фигова, но графика хорошая...
Лучший игровой сервер - Земля: карта всего одна, но на 7 миллиардов игроков; читеров нет, админ терпеливый, но если уж забанит...
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Как организовать замену дубликатов файлов на симлинки в разных каталогах

Сообщение watashiwa_daredeska »

yamah писал(а):
19.01.2012 07:58
Создавать дополнительные точки монтирования и монтировать туда эти два каталога, что бы прогонять fdupes
Хм… А зачем дополнительные точки монтирования? Что мешает гонять fdupes прямо на этих?
Спасибо сказали:
Аватара пользователя
yamah
Сообщения: 1116
ОС: Rosa Fresh, Debian, RELS

Re: Как организовать замену дубликатов файлов на симлинки в разных каталогах

Сообщение yamah »

watashiwa_daredeska писал(а):
19.01.2012 09:40
Хм… А зачем дополнительные точки монтирования? Что мешает гонять fdupes прямо на этих?

Что-то действительно ступил.

Часть проблемы решил:

Код: Выделить всё

fdupes -r -1 <каталог 1> <каталог 2> | while read LINE; do ln -s -f $LINE; done


Но осталась проблема с именами каталогов содержащих пробел.
Понимание - это меч с тремя кромками: ваша правда, наша правда и Истина.
Жизнь - игра: сюжет задуман фигова, но графика хорошая...
Лучший игровой сервер - Земля: карта всего одна, но на 7 миллиардов игроков; читеров нет, админ терпеливый, но если уж забанит...
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Как организовать замену дубликатов файлов на симлинки в разных каталогах

Сообщение /dev/random »

yamah писал(а):
19.01.2012 10:38
Часть проблемы решил:

Код: Выделить всё

fdupes -r -1 <каталог 1> <каталог 2> | while read LINE; do ln -s -f $LINE; done


Но осталась проблема с именами каталогов содержащих пробел.

Код: Выделить всё

... | while read -r; do ln -s -f "$REPLY"; done

Спасибо сказали:
Аватара пользователя
yamah
Сообщения: 1116
ОС: Rosa Fresh, Debian, RELS

Re: Как организовать замену дубликатов файлов на симлинки в разных каталогах

Сообщение yamah »

/dev/random писал(а):
19.01.2012 10:41

Код: Выделить всё

... | while read -r; do ln -s -f "$REPLY"; done

Код: Выделить всё

fdupes -r -1 ~/11/test/1 ~/11/test/2 | while read -r; do ln -s -f "$REPLY"; done

Создает ссылку в текущем каталоге на объект с адресом "/home/<user>/11/test/1/file1 /home/<user>/11/test/2/11/file2", то есть на то, что выводит fduples.
Если путь с пробелом, то адрес создается файсл с симлинком на "/home/<user>/11/test/1/1\ 1/file1 /home/<user>/11/test/2/11/file2" (Это для файлов "/home/<user>/11/test/1/1 1/file1" "/home/<user>/11/test/2/11/file2")

UPD:
Поизвращатся в подсчете количества пробелов в строке и порезать на две подстроки по последнему пробелу?
Понимание - это меч с тремя кромками: ваша правда, наша правда и Истина.
Жизнь - игра: сюжет задуман фигова, но графика хорошая...
Лучший игровой сервер - Земля: карта всего одна, но на 7 миллиардов игроков; читеров нет, админ терпеливый, но если уж забанит...
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Как организовать замену дубликатов файлов на симлинки в разных каталогах

Сообщение /dev/random »

yamah писал(а):
19.01.2012 11:05
Создает ссылку в текущем каталоге на объект с адресом "/home/<user>/11/test/1/file1 /home/<user>/11/test/2/11/file2", то есть на то, что выводит fduples.

Да, ошибся. Мне показалось, что вам в текущем и надо, и что вы указали -f в fdupes.

В таком случае попробуйте убрать -1 в fdupes и читать строки отдельными вызовами read.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Как организовать замену дубликатов файлов на симлинки в разных каталогах

Сообщение watashiwa_daredeska »

yamah писал(а):
19.01.2012 10:38
Часть проблемы решил:

Код: Выделить всё

fdupes -r -1 <каталог 1> <каталог 2> | while read LINE; do ln -s -f $LINE; done


Но осталась проблема с именами каталогов содержащих пробел.
А зачем опция '-1'?

Код: Выделить всё

fdupes -r /master /slave \
  | while read line; do
      if [ -z "$line" ]; then
        src=
      elif [ -z "$src" ]; then
        src="$line"
      else
        rm "$line"
        ln -s "$src" "$line"
      fi
    done
Если симлинки нужны с относительными путями, то будет чуть позаковыристей.
Спасибо сказали:
Аватара пользователя
yamah
Сообщения: 1116
ОС: Rosa Fresh, Debian, RELS

Re: Как организовать замену дубликатов файлов на симлинки в разных каталогах

Сообщение yamah »

watashiwa_daredeska писал(а):
19.01.2012 11:38
А зачем опция '-1'?

Изначально пытался упростить команду.
Тем более, что для имен файлов не содержащих пробелов (как в самом имени, так и в полном пути) работает.

watashiwa_daredeska писал(а):
19.01.2012 11:38

Код: Выделить всё

fdupes -r /master /slave \
  | while read line; do
      if [ -z "$line" ]; then
        src=
      elif [ -z "$src" ]; then
        src="$line"
      else
        rm "$line"
        ln -s "$src" "$line"
      fi
    done
Если симлинки нужны с относительными путями, то будет чуть позаковыристей.

Спасибо. Все сработало.

Ну и еще вопрос. Разве нельзя эту конструкцию

Код: Выделить всё

rm "$line"
ln -s "$src" "$line"

заменить на

Код: Выделить всё

ln -s -f "$src" "$line"

?
Понимание - это меч с тремя кромками: ваша правда, наша правда и Истина.
Жизнь - игра: сюжет задуман фигова, но графика хорошая...
Лучший игровой сервер - Земля: карта всего одна, но на 7 миллиардов игроков; читеров нет, админ терпеливый, но если уж забанит...
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Как организовать замену дубликатов файлов на симлинки в разных каталогах

Сообщение watashiwa_daredeska »

yamah писал(а):
19.01.2012 12:12
Ну и еще вопрос. Разве нельзя эту конструкцию

Код: Выделить всё

rm "$line"
ln -s "$src" "$line"

заменить на

Код: Выделить всё

ln -s -f "$src" "$line"
Можно.
Спасибо сказали: