Las funciones de cambio de consola en el terminal virtual del kernel se definen en el emulador de terminal integrado del kernel(drivers/tty/vt/keyboard.c
en el árbol de fuentes del kernel )y se activan mediante combinaciones de teclas en el mapa de teclas del kernel(drivers/tty/vt/defkeymap.map
). Su sistema probablemente tenga este archivo (o uno muy similar )instalado bajo /usr/share/kbd/keymaps
.
Si está buscando modificar el comportamiento de cambio de alguna manera, esto implicará piratear el código del kernel y compilar su propio kernel parcheado.
Si todo lo que desea hacer es cambiar las combinaciones de teclas, puede crear su propio mapa de teclas y usar la utilidad loadkeys
para instalarlo. Comience con su mapa de teclas preferido y cambie la definición de los símbolos Console_N
(y los relacionados Last_Console
, Decr_Console
,Incr_Console
):
#...
keycode 59 = F1 F11 Console_13
control keycode 59 = F1
alt keycode 59 = Console_1
control alt keycode 59 = Console_1
keycode 60 = F2 F12 Console_14
control keycode 60 = F2
alt keycode 60 = Console_2
control alt keycode 60 = Console_2
#...
Tenga en cuenta que esto solo afecta al emulador de terminal integrado del kernel, lo que significa que solo se ve afectada la consola virtual integrada. X11, Wayland y contextos similares usan XKB para lograr una funcionalidad similar. En XKB, consulte /usr/share/X11/xkb/compat/xfree86
para las acciones interpretadas, .../xkb/types/pc
para el tipo CTRL+ALT
utilizado y .../xkb/symbols/srvr_ctrl
para las definiciones de tecla F -.
cd lotsafiles
for i in {1..20000}; do
dirnum="$(((i/500)+1))"
mkdir -p "dir_${dirnum}" # using -p allows this to be less noisy on repeat runs
mv "file${i}.png" "dir_${dirnum}"/
done
Что-то простое вроде:
#!/bin/bash
typeset -i i
typeset -i j
typeset -i k
i=0
j=0
k=0
mkdir dir_$j
for file in * ; do
i=$i+1
k=$k+1
if [ $i = 500 ] ; then
j=$j+1
i=0
mkdir dir_$j
fi
mv "$file" dir_$j/file_$k
done
Не тестировалось, поэтому вы можете поставить echo
перед mv "$file" dir_$j
, чтобы увидеть, делает ли он то, что вам нужно. В любом случае это даст вам представление о том, как сделать то, что вы хотите.
#!/bin/sh
files_per_dir=500
set -- file_*
printf 'There are %d files\n' "$#"
printf 'Putting %d files in each new directory\n' "$files_per_dir"
N=0 # directory counter
n=0 # file counter
for filename do
if [ "$(( n % files_per_dir ))" -eq 0 ]; then
N=$(( N + 1 ))
dir="dir_$N"
printf 'Creating directory %s\n' "$dir"
# mkdir "$dir"
fi
n=$(( n + 1 ))
printf 'Moving %s to %s\n' "$filename" "$dir"
# mv -i -- "$filename" "$dir"
done
В приведенном выше примере в каждый каталог помещается 500 файлов. (Фактические команды, которые изменяют что-то, были закомментированы для безопасности ). Предполагается, что имена файлов соответствуют file_*
, и каждый новый каталог будет называться dir_N
, где N
— положительное целое число.
Если вы хотите переместить файлы на основе их числовых имен (вышеприведенное сортирует файлы в лексикографическом порядке ), затем используйте
printf 'Moving %s to %s\n' "file_$n" "$dir"
# mv -i -- "file_$n" "$dir"
вместо (т.е. замените соответствующие две строки в первом скрипте на эти, в таком порядке ).
Укороченная версия:
#!/bin/sh
files_per_dir=500
set -- file_*
n=0
for filename do
n=$(( n + 1 ))
N=$(( (n/files_per_dir) + 1 ))
[ ! -d "dir_$N" ] && mkdir "dir_$N"
# mv -i -- "$filename" "dir_$N"
# or...
# mv -i -- "file_$n" "dir_$N"
done