Скрипт Удалить все жесткие ссылки для конкретного файла
Я хочу удалить все жесткие ссылки для конкретного файла.
Использование будет script somefile, это будет считать жесткие ссылки для файла somefile, а затем удалит все жесткие ссылки, сохраняя только этот файл.
Команда
find / -samefile file-name | xargs rm
будет делать необходимое, но это также удаляет исходный файл.
Также вы можете использовать
find / -inum Inode-number | xargs rm
Но это также приведет к удалению исходного файла.
Мой первый скрипт veriosn выглядит так
#!/bin/bash
file=$1
inode=`ls -li $file | cut -d" " -f1`
find / -inum $inode | xargs rm
Но, как я сказал выше, это также приведет к удалению исходного файла, так как сохранить первый экземпляр и удалить другие.
2 ответа
Ты можешь использовать ! с путем к исходному файлу, чтобы исключить это:
$ find . -samefile bar
./baz
./bar
$ find . -samefile bar ! -path "./bar"
./baz
Путь должен соответствовать тому, что find выходы, поэтому используйте абсолютные пути, если вы ищете из /,
Заметки:
findимеет-deleteкомандаЕсли в сочетании с
xargsиспользовать-print0а также-0:find . -samefile bar ! -path "./bar" -print0 | xargs -0 rmиспользование
statполучить номер индекса напрямую:$ stat -c '%i' bar 257643
Это работает как для абсолютных, так и для относительных имен файлов, плюс оно не печатает никаких диалогов "Отказано в доступе" и печатает Deletion failed: <filename> при удалении происходит сбой:
find / -samefile "$1" \! -path "${PWD}/$1" \! -delete -printf 'Deletion failed: %p\n' 2>/dev/null