Вот один из них, использующий 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
, и мы переименовываем файлы на основе списка, добавляя суффикс, чтобы не перезаписывать старые файлы. Второй цикл просто удаляет суффиксы.
Вышеприведенное предполагает, что имена файлов не содержат табуляции или новой строки.
(Вы можете реализовать алгоритм тасования вручную в оболочке, но я думаю, что это немного запутает.)
Числовые аргументы могут передаваться функциям 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.