Нахождение дубликатов файлов и заменяет их символьными ссылками

Не ясно точно, что Вы сделали “при расширении LVM”. Кажется что, что Вы сделали требуемое обновление некоторых значений, что Личинка должна определить местоположение корневой файловой системы: один из жестких дисков изменил свою идентификацию.

В то время как, вероятно, возможно загрузить Вашу систему путем выдачи правильных команд при этой подсказке, это довольно сложно и трудно объяснить, не будучи перед машиной. Необходимо будет определить местоположение корневого устройства, смонтировать его и работать /init переключаться на него.

Я рекомендую загрузить от спасения CD/USB. SystemRescueCD является хорошим выбором. Активируйте и смонтируйте корневой объем своей системы, затем выполните следующие команды в терминале (с корневым объемом, смонтированным на /target):

mount --rbind /dev /target/dev
mount --rbind /proc /target/proc
mount --rbind /sys /target/sys
chroot /target
update-grub

С Вашей установкой я думаю, что это приведет к загрузочной системе. Если это не делает, отправьте содержание /boot/grub/grub.cfg и /etc/fstab.

16
01.03.2019, 18:51
4 ответа

сначала; Есть ли причина, по которой вам нужно использовать SymLinks, а не обычные хардлинки? Мне трудно понять необходимость симликовых с относительными путями. Вот как я решил эту проблему:

Я думаю, что версия FDUPES Debian (Ubuntu) может заменить дубликаты с жесткой Ссылки с использованием опции -L , но у меня нет установки Debian для проверки это.

Если у вас нет версии с вариантом -L -L , вы можете использовать этот крошечный скрипт Bash, который я нашел в Commandlinefu .
Обратите внимание, что этот синтаксис будет работать только в Bash.

fdupes -r -1 path | while read line; do master=""; for file in ${line[*]}; do if [ "x${master}" == "x" ]; then master=$file; else ln -f "${master}" "${file}"; fi; done; done

Вышеуказанная команда найдет все дублирующие файлы в «Путь» и замените их жесткие линиим. Вы можете проверить это с помощью LS -ILR и глядя на inode номер. Вот сэмль с десятью идентичными файлами:

$ ls -ilR

total 20
3094308 -rw------- 1 username group  5 Sep 14 17:21 file
3094311 -rw------- 1 username group  5 Sep 14 17:21 file2
3094312 -rw------- 1 username group  5 Sep 14 17:21 file3
3094313 -rw------- 1 username group  5 Sep 14 17:21 file4
3094314 -rw------- 1 username group  5 Sep 14 17:21 file5
3094315 drwx------ 1 username group 48 Sep 14 17:22 subdirectory

./subdirectory:
total 20
3094316 -rw------- 1 username group 5 Sep 14 17:22 file
3094332 -rw------- 1 username group 5 Sep 14 17:22 file2
3094345 -rw------- 1 username group 5 Sep 14 17:22 file3
3094346 -rw------- 1 username group 5 Sep 14 17:22 file4
3094347 -rw------- 1 username group 5 Sep 14 17:22 file5

Все файлы имеют отдельные номера INODE, что делает их отдельные файлы. Теперь давайте дедупливировать их:

$ fdupes -r -1 . | while read line; do j="0"; for file in ${line[*]}; do if [ "$j" == "0" ]; then j="1"; else ln -f ${line// .*/} $file; fi; done; done
$ ls -ilR
.:
total 20
3094308 -rw------- 10 username group  5 Sep 14 17:21 file
3094308 -rw------- 10 username group  5 Sep 14 17:21 file2
3094308 -rw------- 10 username group  5 Sep 14 17:21 file3
3094308 -rw------- 10 username group  5 Sep 14 17:21 file4
3094308 -rw------- 10 username group  5 Sep 14 17:21 file5
3094315 drwx------  1 username group 48 Sep 14 17:24 subdirectory

./subdirectory:
total 20
3094308 -rw------- 10 username group 5 Sep 14 17:21 file
3094308 -rw------- 10 username group 5 Sep 14 17:21 file2
3094308 -rw------- 10 username group 5 Sep 14 17:21 file3
3094308 -rw------- 10 username group 5 Sep 14 17:21 file4
3094308 -rw------- 10 username group 5 Sep 14 17:21 file5

файлы теперь имеют тот же номер индикатора, что означает, что все они указывают на то же самое Физические данные на диске.

Я надеюсь, что это решает вашу проблему или хотя бы очнует вас в правильном направлении!

3
27.01.2020, 19:49

Таким образом, ответ, данный arnefm (который был скопирован по всему интернету) не имеет дело с пробелами в именах файлов. Я написал скрипт, который работает с пробелами в именах файлов.

#!/bin/bash
fdupes -r -1 CHANGE_THIS_PATH | sed -e 's/\(\w\) /\1|/g' -e 's/|$//' > files
while read line; do
        IFS='|' read -a arr <<< "$line"
        orig=${arr[0]}
        for ((i = 1; i < ${#arr[@]}; i++)); do
                file="${arr[$i]}"
                ln -sf "$orig" "$file"
        done 
done < files

Что он делает, так это находит дубликаты и записывает их PIPE, разделенные в файл с именем 'файлы'.

Затем он считывает файл обратно, строка за строкой, в массив, и каждый элемент массива делится на PIPE.

Затем происходит итерация по всем не-первым элементам массива, заменяя файл сим-ссылкой на первый элемент.

Внешний файл ("файлы") может быть удален, если команда fdupes выполняется в подоболочке, которая читается непосредственно в то время, но этот способ кажется более понятным.

1
27.01.2020, 19:49

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

#!/usr/bin/env python
# Reads fdupes(-r -1) output and create relative symbolic links for each duplicate
# usage: fdupes -r1 . | ./lndupes.py

import os
from os.path import dirname, relpath, basename, join
import sys

lines = sys.stdin.readlines()

for line in lines:
    files = line.strip().split(' ')
    first = files[0]
    print "First: %s "% first
    for dup in files[1:]:
        rel = os.path.relpath(dirname(first), dirname(dup))
        print "Linking duplicate: %s to %s" % (dup, join(rel,basename(first)))
        os.unlink(dup)
        os.symlink(join(rel,basename(first)), dup)

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

4
27.01.2020, 19:49

Si no le gustan mucho las secuencias de comandos, puedo recomendar rdfind . Que escaneará directorios dados en busca de archivos duplicados y los reemplazará con enlaces físicos o simbólicos. Lo he usado para deduplicar mi directorio de gemas de Ruby con gran éxito. Está disponible en Debian/Ubuntu.

10
27.01.2020, 19:49

Теги

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