Как копировать файлы по одному в разные папки?

TTY в Unix и Linux являются чем-то вроде "плохого ООП" в том смысле, что все втиснуто в "базовый класс". Существуют различные типы устройств, каждый из которых является «типом --TTY», но все они обладают свойствами, связанными со скоростью передачи данных последовательного ввода-вывода :, битами кадрирования, аппаратным квитированием связи и т. д.

На самом деле это хорошо, поскольку значительно упрощает модель программирования. На любом типе TTY-устройства вы можете вызвать библиотечную функцию POSIX C tcgetattr, чтобы получить структуру одного типа(struct termios)его свойств :«один размер подходит всем».

Однако это означает, что не все свойства на самом деле работают со всеми устройствами TTY.

Ни консоль Linux, ни виртуальные оконные терминалы, такие как Xterm или Gnome Terminal, на самом деле не используют скорость передачи данных и другие аппаратные настройки ни для каких целей. Скорость передачи данных можно установить и восстановить, но она ничего не делает.

Если вам нужен терминал, который на самом деле работает со скоростью 9600 бод, вы должны либо подключиться к последовательному порту, либо написать патч ядра, чтобы имитировать влияние скорости передачи данных на консолях.

Чтобы пройти через последовательный порт без второго компьютера или фактического терминала, вы можете просто подключить «последовательный ключ USB» между портом USB и портом RS -232. Или, если у вас нет порта RS -232, перейдите от USB-порта к последовательному USB-адаптеру, к нуль-модемному кабелю/разъему, к другому последовательному USB-адаптеру и к другому USB-порту.

В любом случае вы получите пару последовательных устройств, которые соединены между собой внешним шлейфом. Вы превращаете один в последовательную консоль, а затем запускаете программу последовательной связи на другом, например, Minicom.

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

-1
07.08.2019, 20:54
2 ответа

The result is, that the 3 files are in the 3rd folder.

Вы имеете в виду :1-ю папку? Почему вы выбираете fquantity=3, если у вас всего 3 файла? Количество файлов -в папке -!

Я проверил этот цикл for, и пока он работает. Вы должны выбрать правильное «количество», чтобы равномерно распределить файлы по каталогам.

Ваш вопрос действительно немного сложно понять из-за названий файлов и их количества. А :01.txt относится к 01.abc, "но имена не следует рассматривать".

Допустим, у вас есть 3000 файлов, которые нужно переместить в 17 папок. Или это x папок, каждая с макс. 200 файлов? Это будет первый шаг, простая математика и цикл со счетчиком.

Затем идут вопросы "надежности" (пробелов )и производительности, а также того, как использовать стандартные команды для упрощения "программы".

Ваш пример:

for FOLDER in $FOLDERLIST; do mv `$LISTFILESCMD | head -n $FQUANTITY`   $FOLDER; done

в некотором роде элегантен, потому что ему не нужен список файлов :, который он читает в оставшихся(неперемещенных )файлах. И это должно быть достаточно быстро, потому что вы заполняете каждую папку только один раз, одной большой командой mv.

Выбрав правильный аргумент дляhead(fколичество )Я мог бы преобразовать 7 файлов в 3 каталога, как я хочу ---Я думал, что хочу 3 -3 -1. Но если я выберу количество " 7», я получаю все 7 файлов в ПЕРВОМ каталоге. С «1» я получаю 1 -1 -1 и четыре неперемещенных файла. Идеальным было бы 3 -2 -2... так что, возможно, математика не такая уж простая.

Но :имя файла с пробелами не перемещается, и его части не находят mv. Автор был удивлен, как кажется, и прокомментировал:о, должно быть проблема с пробелами .

0
28.01.2020, 05:12

Ваше решение с массивами должно работать даже с файлами, содержащими пробелы, поскольку вы правильно указали расширения. Однако у вас могут возникнуть проблемы с именами файлов, начинающимися с тире, используйте mv -- file dir/, чтобы предотвратить это (, или поместите ./перед глобусами:./*вместо *и т. д. ).

Что касается выбора только файлов, я не думаю, что есть способ сделать это непосредственно в Bash (zsh может это сделать, хотя ). Но мы можем просто выбрать список всего и отфильтровать из него обычные файлы :

.
#!/bin/bash

dirs=(*/)   # directories
tmp=(*)     # everything
files=()    # files

for f in "${tmp[@]}"; do
    if [ -f "$f" ]; then
        files+=("$f")
    fi
done

for ((i=0 ; i < ${#dirs[@]} ; ++i)); do
    mv -- "${files[i]}" "${dirs[i]}"
done
0
28.01.2020, 05:12

Теги

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