2015-02-09 3 views
1

Я хочу, чтобы иметь возможность удалять повторяющиеся файлы и в то же время создавать символическую ссылку на удаленные повторяющиеся строки. До сих пор я могу отображать дубликаты файлов, проблема заключается в удалении и удалении. Поскольку я хотите сохранить копиюУдаление повторяющихся файлов в Unix

find "[email protected]" -type f -print0 | xargs -0 -n1 md5sum | sort --key=1,32 | uniq -w 
32 -d --all-repeated=separate 

Выход:

1463b527b1e7ed9ed8ef6aa953e9ee81 ./tope5final 
1463b527b1e7ed9ed8ef6aa953e9ee81 ./Tests/tope5 

2a6dfec6f96c20f2c2d47f6b07e4eb2f ./tope3final 
2a6dfec6f96c20f2c2d47f6b07e4eb2f ./Tests/tope3 

5baa4812f4a0838dbc283475feda542a ./tope1bfinal 
5baa4812f4a0838dbc283475feda542a ./Tests/tope1b 

69d7799197049b64f8675ed4500df76c ./tope3afinal 
69d7799197049b64f8675ed4500df76c ./Tests/tope3a 

945fe30c545fc0d7dc2d1cb279cf9c04 ./Tests/butter6 
945fe30c545fc0d7dc2d1cb279cf9c04 ./Tests/tope6 

98340fa2af27c79da7efb75ae7c01ac6 ./tope2cfinal 
98340fa2af27c79da7efb75ae7c01ac6 ./Tests/tope2c 

d15df73b8eaf1cd237ce96d58dc18041 ./tope1afinal 
d15df73b8eaf1cd237ce96d58dc18041 ./Tests/tope1a 

d5ce8f291a81c1e025d63885297d4b56 ./tope4final 
d5ce8f291a81c1e025d63885297d4b56 ./Tests/tope4 

ebde372904d6d2d3b73d2baf9ac16547 ./tope1cfinal 
ebde372904d6d2d3b73d2baf9ac16547 ./Tests/tope1c 

в этом случае, например, я хочу, чтобы удалить ./tope1cfinal и остаться с ./Tests/tope1c. После удаления я также хочу создать символическую ссылку с именем/tope1cfinal, указывающим на/Tests/tope1c.

+0

1. Почему вы хотите удалить 'tope1cfinal' и не' Тест/tope1c'? 2. Почему вы хотите использовать символическую ссылку, а не жесткую ссылку? (два вопроса так или иначе связаны: жесткая ссылка сделает процесс более симметричным). –

+0

Символическая ссылка укажет на исходный файл. И поскольку некоторые программы по-прежнему хотят получить доступ к исходному удаленному файлу, символьная ссылка будет достаточной. – Alexander

+0

Это не объясняет, почему вы предпочитаете символическую ссылку по жесткой ссылке. И это не отвечает на вопрос 1. –

ответ

1

Одна возможность: создать ассоциативный массив, ключи которого являются md5sum, полями которых является соответствующий первый найденный файл (тот, который не будет удален). Каждый раз, когда md5sum находится в этом ассоциативном массиве, файл будет удален и будет создана соответствующая ссылка на соответствующий ключ (после проверки того, что файл для удаления не является исходным файлом). Заставляет каталоги искать в качестве аргументов; без аргументов поиск выполняется внутри текущего каталога.

#!/bin/bash 

shopt -s globstar nullglob 

(($#==0)) && set . 

declare -A md5sum=() || exit 1; 
while(($#)); do 
    [[ $1 ]] || continue 
    for file in "$1"/**/*; do 
     [[ -f $file ]] || continue 
     h=$(md5sum < "$file") || continue 
     read h _ <<< "$h" # This line is optional: to remove the hyphen in the md5sm 
     if [[ ${md5sum[$h]} ]]; then 
      # already seen this md5sum 
      [[ "$file" -ef "${md5sum[$h]}" ]] && continue # prevent unwanted removal! 
      rm -- "$file" || continue 
      ln -rs -- "${md5sum[$h]}" "$file" 
     else 
      # first time seeing this file 
      md5sum[$h]=$file 
     fi 
    done 
    shift 
done 

(непроверенная, используйте на свой страх и риск!)

+0

Правильно сохранить ln -r. -r-переключатель не существует. – Alexander

+0

@ Александр: это, вероятно, зависит от версии 'ln', которую вы используете. Рад, что это помогло! –

Смежные вопросы