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

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

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

Но, как я сказал выше, это также приведет к удалению исходного файла, так как сохранить первый экземпляр и удалить другие.

4
задан 1 June 2015 в 18:26

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 для получения inode числа непосредственно:

    $ stat -c '%i' bar
    257643
    
0
ответ дан 1 June 2015 в 18:26

Это работает и на абсолютные и на относительные имена файлов плюс он, не печатает "Разрешения, отклоненного" диалоговые окна и печать Deletion failed: <filename> при удалении сбоев:

find / -samefile "$1" \! -path "${PWD}/$1" \! -delete -printf 'Deletion failed: %p\n' 2>/dev/null
0
ответ дан 1 June 2015 в 18:26

Другие вопросы по тегам:

Похожие вопросы: