Я хочу удалить все жесткие ссылки для определенного файла.
Использование будет 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
Но, как я сказал выше, это также приведет к удалению исходного файла, так как сохранить первый экземпляр и удалить другие.
Можно использовать !
с путем к исходному файлу для исключения его:
$ 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
для получения inode числа непосредственно:
$ stat -c '%i' bar
257643
Это работает и на абсолютные и на относительные имена файлов плюс он, не печатает "Разрешения, отклоненного" диалоговые окна и печать Deletion failed: <filename>
при удалении сбоев:
find / -samefile "$1" \! -path "${PWD}/$1" \! -delete -printf 'Deletion failed: %p\n' 2>/dev/null