Разбить большую папку на несколько подпапок с последовательными именами [дубликат]

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.cen 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 loadkeyspara 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/xfree86para las acciones interpretadas, .../xkb/types/pcpara el tipo CTRL+ALTutilizado y .../xkb/symbols/srvr_ctrlpara las definiciones de tecla F -.

-3
08.01.2019, 02:08
3 ответа
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
0
28.01.2020, 05:18

Что-то простое вроде:

#!/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, чтобы увидеть, делает ли он то, что вам нужно. В любом случае это даст вам представление о том, как сделать то, что вы хотите.

-1
28.01.2020, 05:18
#!/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
3
28.01.2020, 05:18

Теги

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