Печатать только одно значение из дубликатов

Для подхода AWK:

find [Directory] -type f [various other find options] | 
     awk '{orig=$0; 
           match($0,/^.*\//,path); sub("^"path[0], "");
           match($0, /.[[^.]+$/,ext); sub(ext[0]"$", "");
           ("echo \"" $0 "\"|md5sum") | getline;
           com=sprintf("mv \"%s\" \"%s%s%s\"", orig, p[0], $1, ext[0]);
           print(com)
           }'

Современные findкоманды не требуют каталога для ввода ., поэтому [Каталог] можно оставить пустым. -type fнаходит только файлы, что удобно, так как md5sumне любит каталоги, и изменение имени каталога во время работы не было бы хорошей идеей. Используйте -iname pattern, если вы хотите использовать только некоторые файлы, например. -iname \*.dat, если важен регистр, используйте -nameвместо -iname.

Части match(...); sub(...)извлекают части имени файла и заменяют их во входной строке. Обратите внимание, что "^"и "$"добавляются [pre/ap], чтобы предотвратить замену строки, которая может повторять путь/расширение.

Замените print(com)на system(com), чтобы выполнить переименование.

Если вы хотите использовать md5sumфактического файла в качестве имени, вы можете использовать тот факт, что md5sumвыводит сумму и входное имя файла, чтобы сделать что-то вроде:

 find -type f -exec md5sum '{}' ';' | 
     while read sum file ; do 
       [echo] mv "$file" "`dirname $file`/$sum".extension ; 
     done

while read sum fileпримет 2 аргумента, результаты команды md5sum, и назначит с ними переменные sumи file. Поскольку в sumне должно быть пробелов, readдолжно работать нормально.

Очевидно, что [echo]следует удалить при фактическом запуске, но всегда полезно проверить поиск перед запуском при тестировании любых изменений в сценарии.

Все это предполагает, что вы используете bash. Кроме того, это можно напечатать как одну длинную строку:

find -iname \*.jpg -exec md5sum '{}' ';' | while read sum file ; do mv "$file" "`dirname $file`/$sum".jpg ; done
0
06.09.2020, 14:39
2 ответа

Вы можете добавить номера строк к выходным данным с помощью cat -nс последующей уникальной сортировкой по второму полю.
Затем выполните числовую сортировку в первом поле, чтобы сохранить исходный порядок, и удалите номера строк с помощьюcut:

$ cat -n file.txt | sort -uk2,2 | sort -nk1,1 | cut -f2
code-coverage-api
jsch
cloudbees-folder
apache-httpcomponents-client-4-api
jackson2-api
workflow-api
echarts-api
envinject-api
workflow-durable-task-step
2
18.03.2021, 23:06

Попробуйте сделать следующее, чтобы получить уникальные элементы файла

cat file.txt | sort | uniq

Если вы хотите удалить дубликаты. Затем вы можете просто обновить файл, выполнив команду

cat file.txt | sort | uniq > file.txt

[ПРИМЕЧАНИЕ. :uniq учитывает только соседние элементы. Вот почему мы должны рассортировать.]

1
18.03.2021, 23:06

Теги

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