Я пытаюсь найти способ проверить в заданном каталоге дубликаты файлов (даже с разными именами) и заменить их символическими ссылками, указывающими на первое вхождение. Я пытался с, fdupes
но он просто перечисляет эти дубликаты.
Это контекст: я настраиваю тему значков по своему вкусу, и я обнаружил, что многие значки, даже если они имеют разные имена и разные местоположения в родительской папке и используются для разных целей, в основном одинаковы картина. Поскольку применение одной и той же модификации двадцать или тридцать раз является излишним, когда действительно необходим только один, я хочу оставить только одно изображение и дать ссылку на все остальные.
Например, если я запускаю fdupes -r ./
внутри каталога testdir
, он может вернуть мне следующие результаты:
./file1.png
./file2.png
./subdir1/anotherfile.png
./subdir1/subdir2/yetanotherfile.png
Учитывая этот вывод, я хотел бы сохранить только файл file1.png
, удалить все остальные и заменить их символическими ссылками, указывающими на него, сохраняя при этом все исходные имена файлов. Таким образом file2.png
, сохранит свое имя, но file1.png
вместо ссылки станет ссылкой на него.
Эти ссылки не должны указывать на абсолютный путь, но должны быть относительно родительского testdir
каталога; т.е. yetanotherfile.png
будет указывать на ../../file1.png
, а не на/home/testuser/.icons/testdir/file1.png
Я заинтересован как в решениях, которые включают GUI и CLI. Необязательно использовать, fdupes
я процитировал это, потому что это инструмент, который я знаю, но я открыт для решений, которые также используют другие инструменты.
Я почти уверен, что bash-скрипт для обработки всего этого не должен быть таким сложным для создания, но я не достаточно опытен, чтобы самому понять, как его написать.
источник
v1.51
(Ubuntu 14.04.2 LTS).jdupes
на github.com/jbruchon/jdupes есть-L
опция, которая делает желаемое жесткое связывание дублирующих наборов.${line//…/}
часть не работала для меня, поэтому я сделал более чистый способ получить первый «главный» файл для hardlink.rsync
другую файловую систему? Или, если файловая система не сохраняет иерархию, например, это резервный сервер, который помещает все под/«machine-name»/...
? Или если вы хотите восстановить из резервной копии? Я не вижу, как здесь будут сохраняться жесткие ссылки. Я думаю, что относительные мягкие ссылки имели бы больше шансов на выживание.Если вам не нравятся скрипты, я могу порекомендовать rdfind . Который будет сканировать заданные каталоги на наличие дубликатов файлов и жестко или мягко связывать их вместе. Я использовал его для дедупликации моего каталога Ruby gems с большим успехом. Это доступно в Debian / Ubuntu.
источник
У меня была похожая ситуация, но в моем случае символическая ссылка должна указывать на относительный путь, поэтому я написал этот скрипт на Python, чтобы добиться цели:
Для каждой строки ввода (которая представляет собой список файлов) скрипт разбивает список файлов (разделенных пробелами), получает относительный путь от каждого файла к первому и затем создает символическую ссылку.
источник
Таким образом, ответ, данный arnefm (который был скопирован по всему Интернету), не касается пробелов в именах файлов. Я написал скрипт, который работает с пробелами в файлах.
Для этого нужно найти дупы и записать их PIPE, разделенные в файл с именем 'files'.
Затем он читает файл обратно, строка за строкой, в массив, и каждый элемент массива отделяется PIPE.
Затем он перебирает все не первые элементы массива, заменяя файл символической ссылкой на первый элемент.
Внешний файл ('files') может быть удален, если команда fdupes выполняется в подоболочке, которая читается напрямую в это время, но этот способ кажется более понятным.
источник
Некоторые предостережения:
fdupes -1r common/base/dir | while read -r -a line ; do ln -sf $(realpath --relative-to ${line[1]} ${line[0]}) ${line[1]}; done
Если более 2 файлов являются дубликатами (например, file1 file2 file3), то нам нужно создать символическую ссылку для каждой пары - рассматривайте file1, file2 и file1, file3 как 2 отдельных случая:
Чтобы автоматически обработать произвольное количество дубликатов в строке, потребуется немного больше усилий.
Другой подход заключается в том, чтобы сначала создать символические ссылки на абсолютные пути, а затем преобразовать их:
Это основано на ответе @Gilles: /unix//a/100955/77319
источник