Я на 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.