Как удалить дубликаты файлов с помощью удара

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

Насколько я знаю, что терминальные клиенты используют пространство индексированного цвета. Одна из причин этого - то, что в его самой простой форме, 256 индексированных цветов могут быть описаны с одним байтом. Пока цветовому пространству RGB нужны два или три байта. Рассматривая, как цвета кодируются в терминальном потоке, каждый цвет, по крайней мере, составил бы два байта + любая умная разметка. Это не могло бы быть большими тисками памяти проблемы, однако когда на потоке сети реального времени они могли бы сложить на задержке, особенно (исправьте меня, если я неправ), каждый символ отправляется в своем собственном пакете.

9
27.03.2015, 01:20
6 ответов

Ближайшей к значению true переменной оболочки является значение set . Есть некоторые свойства собственных параметров, которые также зависят от него. Например:

FLAG=
[ -d "${FLAG:+$HOME}" ] || ! echo \
either \$HOME is not a directory or \$FLAG is null or unset

Выше $ FLAG условно расширяется до значения $ HOME только в том случае, если оно равно набору, а не null. Существует несколько вариантов, но общая суть состоит в том, что значение параметра не всегда так важно, как то, имеет ли параметр значение . Установка для FLAG любого значения, указанного выше, приведет к истинному результату теста , а не к сбою.

-121--195919-

Вы неправильно используете найти и это работает случайно. Видите ли - бегом:

find *.txt 

То, что вы на самом деле делаете, вызывает:

find lect1.txt

И вы выполняете чуть больше, чем эхо . Если, однако, выполнить поиск с критериями поиска - например,

find . -name '*.txt'

Тогда он будет проходить через текущий каталог . и напечатайте любое имя файла, соответствующее спецификации, в любом подкаталоге.

Однако следует проявлять осторожность, поскольку «*», как интерпретируется находкой, * в оболочке и * в регулярном выражении различаются по значению.

Если вы grep ing * означает 'ноль или более экземпляров предыдущего символа.

Итак, вы на самом деле:

  • перекликаетесь со всеми вашими именами файлов (globbing * .txt ).
  • для печати любых символов, соответствующих lec , lect , lectt , lecttttt и т.д. в середине.

В вашем первом примере, тем не менее, вы grep даже не заходите так далеко - shell расширяет ваш образец, так что он на самом деле grepping для всего, что соответствует echo lect * - что может работать случайно, потому что у вас есть файл в вашем каталоге, который расширяется соответствующим образом, но он не делает то, что вы намеревались.

Вместо этого я бы предложил, что вы хотите:

find . -name 'lect*.txt' -print
-121--120221-

Я работаю над Linux, а это команда md5sum , которая выводит:

> md5sum *
d41d8cd98f00b204e9800998ecf8427e  file_1
d41d8cd98f00b204e9800998ecf8427e  file_10
d41d8cd98f00b204e9800998ecf8427e  file_2
d41d8cd98f00b204e9800998ecf8427e  file_3
d41d8cd98f00b204e9800998ecf8427e  file_4
d41d8cd98f00b204e9800998ecf8427e  file_5
d41d8cd98f00b204e9800998ecf8427e  file_6
d41d8cd98f00b204e9800998ecf8427e  file_7
d41d8cd98f00b204e9800998ecf8427e  file_8
d41d8cd98f00b204e9800998ecf8427e  file_9
b026324c6904b2a9cb4b88d6d61c81d1  other_file_1
31d30eea8d0968d6458e0ad0027c9f80  other_file_10
26ab0db90d72e28ad0ba1e22ee510510  other_file_2
6d7fce9fee471194aa8b5b6e47267f03  other_file_3
48a24b70a0b376535542b996af517398  other_file_4
1dcca23355272056f04fe8bf20edfce0  other_file_5
9ae0ea9e3c9c6e1b9b6252c8395efdc1  other_file_6
84bc3da1b3e33a18e8d5e1bdd7a18d7a  other_file_7
c30f7472766d25af1dc80b3ffc9a58c7  other_file_8
7c5aba41f53293b712fd86d08ed5b36e  other_file_9

Теперь с помощью awk и xargs будет выполнена команда:

md5sum * | \
sort | \
awk 'BEGIN{lasthash = ""} $1 == lasthash {print $2} {lasthash = $1}' | \
xargs rm

Часть awk инициализирует lasthash с пустым рядом, который не будет совпадать ни с одним хэшем, а затем проверяет для каждой строки, является ли хэш в lasthash таким же, как хэш (первый столбец) Если он есть, он распечатывает его. В конце каждого шага он устанавливает lasthash в хэш текущего файла (вы можете ограничить это только установкой, если хеши разные, но это должно быть второстепенной вещью, особенно если у вас нет много совпадающих файлов). Имена файлов awk spits подаются в rm с xargs ,который в основном вызывает rm с тем, что дает нам часть awk .

Вероятно, необходимо фильтровать каталоги перед md5sum * .

Изменить:

С помощью метода Маркинса можно также использовать следующий метод:

comm -1 -2 \
  <(ls) | \
  <(md5sum * | \
    sort -k1 | \
    uniq -w 32 | \
    awk '{print $2}' | \
    sort) \
xargs rm

Этот субстрат из списка файлов, оптисуемого ls , является первым именем каждого уникального хэша, оптируемого md5sum * | sort -k1 | uniq -w 32 | awk '{print $2}' .

3
27.01.2020, 20:06

Вы можете определить дубликаты файлов, используя следующую команду:

md5sum * | sort -k1 | uniq -w 32 -d
7
27.01.2020, 20:06

Я наткнулся на fdupes как ответ на этот аналогичный вопрос: https://superuser.com/questions/386199/how-to-remove-duplicated-files-in-a- каталог

Мне удалось apt-get install fdupes на Ubuntu. Вы обязательно захотите прочитать справочную страницу. В моем случае я смог получить желаемые результаты следующим образом:

fdupes -qdN -r / ops / backup /

В котором говорится «рекурсивно просматривайте / ops / backup и найдите все повторяющиеся файлы: оставьте первый копию любого данного файла, а остальные тихо удалите. " Это очень упрощает хранение нескольких дампов базы данных с редкой записью.

2
27.01.2020, 20:06
md5sum * | sort -k1 | uniq -w 32 -d | cut -d' ' -f3 | xargs -I{} sh -c 'rm {}'
  1. взять все значения md5
  2. отсортировать их так, чтобы дубликаты были последовательными для uniq
  3. запустить uniq только для вывода дубликатов
  4. вырезать имя файла из строки со значением md5
  5. многократно вызывать удаление имен файлов
2
27.01.2020, 20:06

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

find. -type f -print0 | xargs -0 md5sum | awk 'h[$1]{ printf "%s\0", $2; next }{ h[$1] = $2 }' | xargs -0 rm

find. -type f -print0:Найти все файлы и вывести их с именами, завершающимися нулем -

xargs -0 md5sum:рассчитать хэши параллельно (настроить -nmax -args и -Pmax -procs по желанию, см.man xargs)

awk 'h[$1]{ printf "%s\0", $2; next }{ h[$1] = $2 }':если в хеш-таблице awk есть запись, содержащая md5sum, которую мы просматриваем в данный момент, то распечатайте имя файла, который мы просматриваем в данный момент, нуль -завершается. В противном случае добавьте имя файла в хеш-таблицу.

xargs -0 rm:взять конвейер -в строках с завершающим нулем и отправить их в rm.

Это намного быстрее, чем fdupes.

Если у вас есть имя файла, содержащее новую строку, awk, вероятно, обрежет его до новой строки, поскольку md5sum также разделяет записи по символам новой строки.

Это основано наhttps://stackoverflow.com/questions/11532157/remove-duplicate-lines-without-sortingи https://stackoverflow.com/questions/9133315/how-can-i-output-null-terminated-strings-in-awk

.
1
27.01.2020, 20:06
comm -13 <(md5sum * | sort | uniq -w 32 -d) <(md5sum * | sort | uniq -w 32 -D) | cut -f 3- -d" " | xargs -d '\n' rm

Характеристики:

  • Все еще работает, если в файле больше одного дубликата
  • Все еще работает, если имена файлов содержат пробелы
  • Все еще работает, если вы использовали псевдоним lsс сортировкой или--color=always
0
27.04.2020, 21:46

Теги

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