Немного расширив решение @Isaac....
Предполагая синтаксис bash
и учитывая:
$ find test -type f
test/AA
test/A
test/C
test/CC
test/B
test/D
где файлы A и AA идентичны, как C и CC;
Это более эффективный конвейер команд.:
$ find test -maxdepth 1 -type f -exec bash -c "md5sum < {}" \; |
sort -k1,1 |
uniq --count
2 102f2ac1c3266e03728476a790bd9c11 -
1 4c33d7f68620b7b137c0ca3385cb6597 -
1 88178a003e2305475e754a7ec21d137d -
2 c7a739d5538cf472c8e87310922fc86c -
Оставшаяся проблема заключается в том, что хэши md5 не говорят вам, какие файлы являются A, B, C или D. Это можно решить, хотя это немного неудобно.
Во-первых, переместите свои файлы в подкаталог или переместите свой PWD на один каталог выше, если это более удобно. В моем примере я работаю в .
, а файлы находятся в test/
.
Я предлагаю вам определить по одному файлу каждого из четырех типов и скопировать их в файл A, B, C и D (и далее, если вам нужно, вплоть до Z):
$ cp -p test/file1002./A
...
$ cp -p test/file93002./N
и т. д. Теперь мы можем построить хэш-таблицу, которая определяет хэши md5 каждого уникального выходного файла A -Z:
$ for file in [A-Z]; do
printf "s/%s/%s/\n" "$(md5sum < $file )" "$file";
done
s/102f2ac1c3266e03728476a790bd9c11 -/A/
s/4c33d7f68620b7b137c0ca3385cb6597 -/B/
s/c7a739d5538cf472c8e87310922fc86c -/C/
s/88178a003e2305475e754a7ec21d137d -/D/
Обратите внимание, что хеш-таблица имеет синтаксис sed
. Вот почему:
Запустим тот же конвейер find... md5sum
выше:
$ find test -maxdepth 1 -type f -exec bash -c "md5sum < {}" \; |
sort -k1,1 |
uniq --count
... и передать его через процесс sed
, который использует приведенную выше хеш-таблицу для замены хеш-значений именами файлов-прототипов. Команда sed
сама по себе будет:
sed -f <(
for file in [A-Z]; do
printf "s/%s/%s/\n" "$(md5sum < "$file")" "$file";
done
)
Чтобы соединить все вместе:
$ find test -maxdepth 1 -type f -exec bash -c "md5sum < {}" \; |
sort -k1,1 |
uniq --count |
sed -f <(
for file in [A-Z]; do
printf "s/%s/%s/\n" "$(md5sum < "$file")" "$file";
done
)
2 A
1 B
1 D
2 C
Если вы видите такой вывод:
2 A
1 B
1 5efa8621f70e1cad6aba9f8f4246b383 -
1 D
2 C
Это означает, что в test/
есть файл, значение MD5 которого не соответствует вашим файлам A -D. Другими словами, где-то существует формат выходного файла E
. Как только вы найдете его (md5sum test/* | grep 5efa8621f70e1cad6aba9f8f4246b383
), вы можете скопировать его в E и заново -запустить :
$ cp -p test/file09876./E
$ find test -maxdepth 1 -type f -exec bash -c "md5sum < {}" \; |
sort -k1,1 |
uniq --count |
sed -f <(
for file in [A-Z]; do
printf "s/%s/%s/\n" "$(md5sum < "$file")" "$file";
done
)
2 A
1 B
1 E
1 D
2 C
Вы можете получить каталог завершения своей системы изpkg-config --variable=completionsdir bash-completion
(/usr/share/bash -завершение/завершения/)
Здесь настраиваются динамические завершения:
$ complete -p git
-bash: complete: git: no completion specification
$ git st<TAB>
st stage stash status sti
$ complete -p git
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main git
Если вы хотите настроить автозаполнение tmux, следуйтеhttps://russellparker.me/post/2018/02/16/tmux-bash-autocomplete/