
Я уже несколько часов пытаюсь это понять, но, похоже, не могу.
Мой вопрос: у меня есть имя файла easy и в нем 4 разных подкаталога.
Теперь мне нужно удалить все из foo (включая жесткие ссылки) и освободить все дисковое пространство foo.
Я попробовал удалить все файлы, введя команду.
rm foo/*
но он не удаляет жесткие ссылки, находящиеся в других подкаталогах.
Затем я попытался проверить, совпадают ли иноды
найти foo -type f -ls | сортировать
и вот что я получил с помощью этой команды
эта команда не показывает другие подкаталоги, только foo/
Может кто-нибудь мне помочь? Спасибо.
решение1
Если вы хотите удалить все файлы, которые жестко связаны с любым из файлов, найденных с помощью нисходящего поиска foo
, с помощью инструментов GNU, вы можете сделать следующее:
dir=foo
mountpoint=$(df --output=target -- "$dir" | tail -n +2)
awk -v RS='\0' -v ORS='\0' '
ARGIND == 1 {inum[$0]; next}
{i=$0; getline}
i in inum
' <(find -- "$dir" -xdev ! -type d -links +1 -printf '%i\0') \
<(find -- "$mountpoint" -xdev ! -type d -printf '%i\0%p\0') |
xargs -r0 rm -f
rm -rf -- "$dir"
Это предполагает GNU df
, GNU awk
, GNU find
и оболочку, подобную GNU shell ( bash
), которая поддерживает подстановку процессов ( <(...)
).
Это также предполагает, $dir
что не начинается с предиката -
или не является им find
(например !
, (
...).
Выше мы ищем файлы во всей файловой системе, $dir
которая принадлежит. Вы можете заменить $mountpoint
только родительский каталог $dir
( .
в данном случае) или другойподкаталоги( 123 ABC def
здесь), если вы знаете, все жесткие ссылки находятся только там.
В приведенном выше коде мы записываем номера инодов всех файлов, не являющихся каталогами, с числом ссылок больше 1, которые найдены с помощью нисходящего $dir
. И ищем эти номера инодов во всей файловой системе (по крайней мере, в тех ее разделах, которые не замаскированы другими файловыми системами и на которые у вас есть разрешения на обход). Номера инодов уникальны только для каждой файловой системы, поэтому мы используем , -xdev
чтобы убедиться, что мы сканируем только ту файловую систему, $dir
в которой она найдена.
решение2
rm -rf foo
rm
- удалить файлы или каталоги.
-f
игнорировать несуществующие файлы и аргументы, никогда не запрашивать.-r
рекурсивно удалить каталоги и их содержимое.