Скрипт Удалить все жесткие ссылки для конкретного файла
Я хочу удалить все жесткие ссылки для конкретного файла.
Использование будет 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