Как удалить жесткие ссылки в Ubuntu, не теряя исходный файл?

Как удалить жесткие ссылки в Ubuntu, не теряя исходный файл?

Я на ubuntu и использую dropbox. Проблема в том, что у меня есть некоторые проблемы с синхронизацией, потому что у меня много жестких ссылок в моей папке с картинками.

Как мне удалить их все простой командой БЕЗ потери картинок? Для одного файла я нашел команду flowing

find /home -xdev -samefile "filename" | xargs rm

Но я не знаю, как это сделать для всех файлов?

спасибо заранее

Информация о моей файловой системе:

Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  7,7G     0  7,7G   0% /dev
tmpfs          tmpfs     1,6G  2,4M  1,6G   1% /run
/dev/nvme0n1p3 ext4      435G  203G  211G  50% /
tmpfs          tmpfs     7,7G  756M  7,0G  10% /dev/shm
tmpfs          tmpfs     5,0M  4,0K  5,0M   1% /run/lock

решение1

Вы можете удалить файл, если на него есть более одной жесткой ссылки, данные будут удалены, когда будет удалена последняя жесткая ссылка. Количество ссылок можно получить с помощью stat -c '%h' {file}(*), поэтому вы можете удалить все файлы с более чем одной жесткой ссылкой на них, что-то вроде этого:

for file in *
do
   links=$(stat -c '%h' "$file")
   [[ -f "$file" ]] && [[ $links -gt 1 ]] && rm "$file" 
done

Как говорится,в конце концов останется только один, а выжившим будет последний проверенный объект, в зависимости от порядка обработки каталогов, алфавитного порядка и т. д.

(*) Он также появляется в выводе ls -l, но его сложнее анализировать...

решение2

Вы можете удалить"дополнительный"копии всех файлов, например:

find /home -xdev -type f -links +1 -delete

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

The-links +1указывает findвыбрать только те файлы ( -type f), которые имеют более одной жесткой ссылки.

Вы могли бы (приложив больше усилий) использовать findдля печати значения inode для каждого файла и сортировать результат и (с awk) записать список файлов для удаления через xargs, но это приведет к проблемам с именами файлов со специальными символами (включая пробелы). Но это было бы тем, как устранить сюрприз, когда файл связан снаружи/home.

решение3

В Unix/Linux/MacOS имя файла в каталоге ссылается на inode (косвенный узел), то есть структуру на диске, котораяДействительноэто файл. Эта ассоциация имени с инодом называетсяжесткая ссылкав отличие отмягкая ссылкапо сути это просто файл, содержащий имя, под которым файл может быть найден. Мягкие ссылки могут сломаться, если часть пути к связанному файлу будет переименована или удалена, тогда как переименование/перемещение одной жесткой ссылки вообще не повлияет на другие.

Таким образом, «исходного файла» не существует.всеЖесткие ссылки имеют точно такой же статус. Inode записывает, сколько жестких ссылок ссылаются на файл ( ls -lпоказывает это число как второе поле; обычно это 1 для файлов --только одна ссылка-- и 2 для каталогов --ссылка в родительском и '.' в самом каталоге; если есть подкаталоги, каждый из них ссылается на своего родителя через '..' и, таким образом, счетчик растет). Пространство, используемое файлом, освобождается, когда счетчик ссылок достигает 0.

Связанный контент