Что позволяет bash автоматически дополнять «команды sub -» tmux?

Немного расширив решение @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
0
15.08.2020, 01:14
1 ответ

Вы можете получить каталог завершения своей системы из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/

0
18.03.2021, 23:12

Теги

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