Как удалить жесткие ссылки на ubuntu без потери исходного файла?

Это не управляющая последовательность оболочки.

Это специальный символ , распознаваемый линейной дисциплиной , когда он находится в каноническом режиме ввода .

Три вещи противостоят вам:

  • Строковая дисциплина не находится в каноническом режиме, когда оболочка Bourne Again использует библиотеку GNU Readline для интерактивного чтения строк ввода. Он находится в неканоническом режиме -, и распознавание всех специальных символов линейной дисциплиной отключено.
  • Библиотека GNU Readline не отвечает за ввод, когда оболочка Bourne Again выполняет что-либо, кроме чтения строки ввода в интерактивном режиме, и сопоставления, установленные для библиотеки Readline, не имеют значения в этих случаях. точки . Когда вы вводите специальный символ, пока оболочка ожидает завершения дочернего процесса, это обрабатывается линейной дисциплиной.
  • Линейная дисциплина может распознавать как специальные только отдельные символы, а не последовательности из нескольких символов, которые терминалы используют для кодирования редактирования и функциональных клавиш. Терминальный API для установки специальных символов работает только с отдельными символами.
1
09.03.2020, 17:45
3 ответа

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

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

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

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

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

2
28.04.2021, 23:21

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

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

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

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

3
28.04.2021, 23:21

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

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

1
28.04.2021, 23:21

Теги

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