Условное удаление дубликатов файлов

Определите меню в своем .twmrc, например:

Menu "MyMenu"
{
    "Opera" f.exec "Opera"
}

Затем привяжите его к левой кнопке мыши вместо кнопки по умолчанию:

Button1 = : root : f.menu "MyMenu"

См. TWM (1 ), чтобы узнать, как настроить TWM в соответствии с вашими потребностями. Вы также можете увидеть примеры конфигурации на xwinman.org .

В TWM отсутствует функция создания динамических меню, поэтому вам потребуется определить меню для каждого набора приложений, которые вы хотите сделать доступными таким образом, или вы можете использовать утилиту xdgmenumaker .

0
12.06.2019, 02:02
3 ответа

Этот скрипт отправит -обработку файла results.txt, сгенерированного из rdfind, как показано в вашем вопросе:

#!/bin/bash
#
while read -r type x x x x x x path
do
    case "$type" in

        DUPTYPE_FIRST_OCCURRENCE)
            name="${path##*/}"
            echo "New path for $name" >&2
            ;;

        DUPTYPE_WITHIN_SAME_TREE|DUPTYPE_OUTSIDE_TREE)
            if [[ -n "$name" ]] && [[ ${path##*/} == $name ]]
            then
                echo "Remove duplicate $path" >&2
                # rm -f "$path"
            else
                echo "Skipping differently named $path" >&2
            fi
            ;;
    esac
done

Раскомментируйте rm, когда будете готовы к тому, чтобы он выполнил свою работу. Закомментируйте операторы echo(или перенаправьте stderr ), если вы не хотите многословия.

Оператор read -r type x x x x x x pathв начале цикла считывает восемь полей, -разделенных пробелами. Средние шесть не имеют значения, поэтому я читаю их в ненужную переменную, которую затем отбрасываю; используются только $typeи $path.

Создатьresults.txt

rdfind -dryrun true -makeresultsfile true {directory...}

Пост -обрабатывает сгенерированный файл(rddedup— это мой скрипт, показанный выше)

rddedup < results.txt
3
21.04.2020, 20:12

Как снять шкуру с этого кота другим способом? (Запрос редактирования OP rmlintбыл сделан как раз в тот момент, когда я собирался опубликовать это, но неважно, может также опубликовать это.... см. редактирование внизуrmlint)

Поскольку структура известна, первое вхождение имени файла является целью, а последующие повторяющиеся имена файлов перед пустой строкой должны быть удалены, тогда мы также могли бы повеселиться с awk, хотя, вероятно, несколько медленнее, чем @roaima

awk 'NF==0{getline; target=""}
     target==""{l=split($8,t,"/"); target=t[l];getline}
     {l=split($8,q,"/");if (q[l]==target)print $8}' file1 | while read f; do echo rm $f ; done

Прохождение

Если у нас есть пустая строка, пропустите ее и сбросьте имя целевого файла на""

awk 'NF==0{getline; target=""}

Если цель не установлена ​​(, то есть после каждой пустой строки и в начале ), мы берем имя целевого файла из этой строки и переходим к следующей

     target==""{l=split($8,t,"/"); target=t[l];getline}

Теперь сверяем имя файла в текущей строке с целевым и выводим полный путь, если есть совпадение

     {l=split($8,q,"/");if (q[l]==target)print $8}' file1

Затем пропустите awkчерез петлю, чтобы выполнить фактическое удаление (просто удалитеecho).

    | while read f; do echo rm $f ; done

Хотя вы также можете сделать это вместо (еще раз, просто удалитеecho)

     {l=split($8,q,"/");if (q[l]==target)print $8}' file1 | xargs echo rm

Редактировать На фронтеrmlintкажется, что вы не можете легко контролировать приоритет оригинальности

По умолчанию, если вы укажете несколько путей в команде rmlint, файлы в первых -именованных путях рассматриваются как более «исходные», чем в путях с более поздними именами. Если по одному пути находятся два файла, то более старый будет считаться исходным. Если они имеют одинаковое время модификации, то это просто вопрос случая, какой из них выбран в качестве оригинала.

Но для вашего явного примера вариант -d(original, являющийся самым нижним в файловой иерархии ), будет работать в сочетании с -bдля сопоставления по имени файла, а не по содержимому.

rmlint -d -b /home/

По общему признанию, это много короче моего сценария, но чтение rmlintстраницы заняло больше времени, чем написание сценария. Выбирайте.

Кстати, не проверено....

1
22.04.2020, 18:50

Здесь исправлен скрипт roaima для случаев, когда дубликаты соответствуют друг другу, но не являются первыми в списке для данного файла. Например. один и тот же файл имеет три имени :a/x, b/yи c/y. Затем, когда a/xявляется базовым файлом (DUPTYPE_FIRST_OCCURRENCE), один из остальных будет удален.

#!/bin/bash

while read -r type x x x x x x path
do
    name="${path##*/}"
    [[ "$type" == '#' ]] || [[ -z "$name" ]] && 
        printf "%s\n" "skipping a non-entry looking line">&2
    case "$type" in
        DUPTYPE_FIRST_OCCURRENCE)
            printf "New path for %s: %s\n" "$name" "$path">&2
            unset ass
            declare -A ass
            ass["$name"]=1
            ;;

        DUPTYPE_WITHIN_SAME_TREE|DUPTYPE_OUTSIDE_TREE)
            if [ "${ass["$name"]}"x != "x" ]
            then
                printf "Remove duplicate: %s\n" "$path" >&2
                # rm -f "$path"
            else
                ass["$name"]=1
                printf "Skipping differently named file: %s\n" "$path" >&2
            fi
            ;;
    esac 
done < results.txt

Включено несколько других изменений, которые должны быть читаемы без комментариев. ass— ассоциативный массив.

Должен признать, что этот скрипт не был хорошо протестирован, так что некоторые нерешенные вопросы все еще могут быть открыты.

Пример использования.rdfind -n true.и вот это:

$ ls *
results.txt  script.bash

a:
filea0  filea1  fileb0

b:
filea1  fileb0

c:
fileb0

результаты.txt:

$ cat results.txt 
# Automatically generated
# duptype id depth size device inode priority name
DUPTYPE_FIRST_OCCURRENCE 4 1 6 64773 4849814 3./a/filea0
DUPTYPE_WITHIN_SAME_TREE -4 1 6 64773 4849816 3./b/filea1
DUPTYPE_WITHIN_SAME_TREE -4 1 6 64773 4849817 3./a/filea1
DUPTYPE_FIRST_OCCURRENCE 6 1 6 64773 4849677 3./a/fileb0
DUPTYPE_WITHIN_SAME_TREE -6 1 6 64773 4849819 3./b/fileb0
DUPTYPE_WITHIN_SAME_TREE -6 1 6 64773 4986586 3./c/fileb0
# end of file

Скрипт в действии:

./script.bash
skipping a non-entry looking line
skipping a non-entry looking line
New path for filea0:./a/filea0
Skipping differently named file: %s\n./b/filea1
Remove duplicate:./a/filea1
New path for fileb0:./a/fileb0
Remove duplicate:./b/fileb0
Remove duplicate:./c/fileb0
skipping a non-entry looking line
1
23.04.2020, 17:11

Теги

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