LINUX.ORG.RU

File has hard-links. Detach before saving?

 


0

2

Как в mcedit отключить предложение разорвать хардлинк при сохранении файла, имеющего хардлинки?
Предположим, я под текущим пользователем желаю никогда их не ломать и сохранять изменения в то, что и как мной налинковано, безо всяких дополнительных вопросов.
Гугление как-то не помогло.

★★★★★

В общем, данная багофича mcedit бывает полезна, когда изредка надо всё-таки разрывать хардлинки.
Для автоматизации их создания в отдельно взятом каталоге получилось вот такое решение:

#!/bin/bash
# Automatically makes identical scripts with different file names $MY_DIR/$SCOPE hard linked to each other

# Syntax:
# $0 MY_DIR

MY_DIR="$1"
SCOPE="*.sh"

echo "Looking for identical files"

{
  while read pathfn; do
    sha256sum $pathfn
  done < <( find "$MY_DIR"/* \( -name "$SCOPE" -o -name ".$SCOPE" \) -a -not \
    \( -path "$MY_DIR/exclude_dir/*" \
    -o -path "$MY_DIR/exclude_dir/.*" \
    -o -path "$(readlink -f $0)" \) 2>/dev/null
  )
} | awk '{ a[$1][$2]++ }END{ for(h in a){n=0; for(p in a[h]){s=s " " p; n++}; if(n>1){print substr(s,2)}; s=""} }' \
  | awk '{ src=$1; for(i=2;i<=NF;i++){ print "[ -f \"" src "\" ] && { rm -f \"" $i "\" && ln \"" src "\" \"" $i "\"; }" } }' \
  | sort | bash -

echo -e "Hard links created:\n"

echo "INODE HARDLINKS PATHFN"
find "$MY_DIR"/* \( -name "$SCOPE" -o -name ".$SCOPE" \) -links +1 -printf "%i %n %p\n" 2>/dev/null | sort -n

echo -e "\nDone."
Она находит в $MY_DIR файлы $SCOPE с идентичным хешем sha256sum и заменяет все, кроме одного, хардлинками на него.
Заморачиваться с cp, тоже умеющим линковать, не стал — мне не нужно ничего никуда копировать.

blexey ★★★★★ ()
4 декабря 2017 г.

bcpl тебе в помощь

anonymous ()
Ответ на: комментарий от unanimous

Спасибо, нет.
fdupes — это какой-то интерактивный обрубок, выполняющий только сравнение и почему-то только по md5, а в качестве бонуса умеющий только удалять. Никаких хардлинков оно делать не умеет.

Мне не для очистки понадобился скрипт выше. А для замены дубликатов содержимого хардлинками, прозрачной для софта.

blexey ★★★★★ ()
Последнее исправление: blexey (всего исправлений: 1)
Ответ на: комментарий от blexey

Хоспаде, какой же ты тугой. fdupes выдаст тебе лист дубликатов, причем исключая уже те, что являются хардлинками друг друга (в твоём костыльном скрипте, кстати, это как-то учитывается или ты делаешь хардлинки на хардлинки?), далее однострочником дубликаты заменяются хардлинками.

Кстати, fdupes и здесь умнее тебя: хоть он и использует md5, файлы с одинаковыми хэшами он сравнивает побайтно, что исключает любые коллизии, при том сохраняя высокую скорость сравнения.

Ну что, осёл, признаешь что осёл?

unanimous ★★★★★ ()
Ответ на: комментарий от unanimous

Это где ж это существуют «хардлинки на хардлинки», которые в онтопике надо специально бояться и обходить? Ну-ка приведи пример. И заодно причину.

Твой «далее однострочник» внезапно мутирует в конвейер похлеще приведенного, или в еще один «эффективный некостыль» от неизвестного автора для частного случая, как случилось ниже.

Осёл - это тот, кто тащит в продакшен решения, которые не исправляются годами, либо форкаются от безысходности.
Почему-то никто эту «эффективность» в официальные репозитории не тащит. Наверное, они тоже ослы?

Неужели ты думаешь, что я не искал и не пробовал доступные альтернативы, прежде чем плюнуть и накидать на коленке своё решение?

blexey ★★★★★ ()
Последнее исправление: blexey (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.