Как передать числовой аргумент функции Readline, например. `шарик -расширить -слово `?

Вот один из них, использующий shufиз GNU coreutils:

paste <(printf "%s\n" *) <(printf "%s\n" * | shuf) |
  while IFS=$'\t' read -r from to; do mv -- "$from" "$to.new"; done

for f in *.new; do mv -- "$f" "${f%.new}"; done 

printf "%s\n" *создает список имен файлов, shufперемешивает их. pasteобъединяет два списка так, чтобы в одном столбце был список имен файлов по порядку, а в другом — в перемешанном порядке. (Вы можете создавать списки во временных файлах, если не хотите использовать подстановку процессов , как это сделано выше; также замените IFS=$'\t'на IFS=$(printf '\t'), если ваша оболочка не поддерживает $''.)

Затем это просто передается в цикл while read, и мы переименовываем файлы на основе списка, добавляя суффикс, чтобы не перезаписывать старые файлы. Второй цикл просто удаляет суффиксы.

Вышеприведенное предполагает, что имена файлов не содержат табуляции или новой строки.

(Вы можете реализовать алгоритм тасования вручную в оболочке, но я думаю, что это немного запутает.)

2
20.06.2020, 16:01
1 ответ

Числовые аргументы могут передаваться функциям Readline с помощью M-0, M-1,..., где M--начинает отрицательный числовой аргумент.

Кроме того, функция universal-argument, опционально связанная с C-u(, см. ниже ), также позволяет передавать числовые аргументы команде, выполняя функцию и затем нажимая последовательность цифр, опционально с предшествующим минусом. знак:

          "\C-u": universal-argument

man bash(отрывок):

   Numeric Arguments
       digit-argument (M-0, M-1,..., M--)
              Add this digit to the argument already accumulating, or start a new argument.  M-- starts a negative argument.
       universal-argument
              This is another way to specify an argument.  If this command is followed by one or more digits, optionally with a leading minus sign, those digits define the argument.  If the command is  followed  by
              digits,  executing  universal-argument again ends the numeric argument, but is otherwise ignored.  As a special case, if this command is immediately followed by a character that is neither a digit nor
              minus sign, the argument count for the next command is multiplied by four.  The argument count is initially one, so executing this function the first time makes the argument count four, a second  time
              makes the argument count sixteen, and so on.
2
18.03.2021, 23:25

Теги

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