Для подхода 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
Вы можете добавить номера строк к выходным данным с помощью 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
Попробуйте сделать следующее, чтобы получить уникальные элементы файла
cat file.txt | sort | uniq
Если вы хотите удалить дубликаты. Затем вы можете просто обновить файл, выполнив команду
cat file.txt | sort | uniq > file.txt
[ПРИМЕЧАНИЕ. :uniq учитывает только соседние элементы. Вот почему мы должны рассортировать.]