Скрипт Удалить все жесткие ссылки для конкретного файла

Я хочу удалить все жесткие ссылки для конкретного файла.

Использование будет 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
Другие вопросы по тегам