Использование такой оболочки, какbash
:
#!/bin/bash
# Get all names.
# This assumes that *.mp3 matches only the things that we'd like to move.
names=( *.mp3 )
# Create our destination directories.
mkdir train dev test
# Calculate some numbers...
n=${#names[@]} # 100% of the files
# Six files at least are needed...
# (or one of the directories will be empty)
if [ "$n" -lt 6 ]; then
printf 'Only %d files\n' "$n"
exit 1
fi
n80=$(( (80*n)/100 )) # 80% of the files
n10=$(( (n - n80)/2 )) # 10% of the files
# Move the files...
mv "${names[@]:0:n80}" train # Move the 80%
mv "${names[@]:n80:n10}" dev # Move the 10%
mv "${names[@]:n80+n10}" test # Move the rest
Это читает имена файлов, которые мы хотели бы переместить в массив с именем names
. Предполагается, что используемый шаблон *.mp3
будет соответствовать только и всем интересующим нас именам (модифицировать этот шаблон под свои нужды ).
Затем вычисляются длины 80% и 10% этого массива.
Перемещение файлов выполняется с помощью фрагментов массива (вbash
). Срез ${arr[@]:offset:length}
представляет собой срез от нуля -, основанного на смещении offset
длины length
. Если аргумент length
отсутствует (, как в последнем вызове mv
), срез выполняется до конца массива.
Количество файлов, которые попадают в каждый каталог, очевидно, будет немного приблизительным из-за того, что мы не готовы разбивать файлы на два (целочисленных арифметических ). Каталог test
, скорее всего, получит на один файл больше, чем dev
, если число файлов не делится без остатка.
Это также зависит от того, что имена файлов достаточно короткие, чтобы 80% файлов можно было переместить за одну операцию. Если это не так, вам придется изменить последние три строки (mv
строки )на
for name in "${names[@]:0:n80}"; do
mv "$name" train
done
for name in "${names[@]:n80:n10}"; do
mv "$name" dev
done
for name in "${names[@]:n80+n10}"; do
mv "$name" test
done
Двоичные файлы в каталогах /sbin
и /usr/sbin
предназначены для запуска только суперпользователями/sudoers. Если вы хотите запустить что-нибудь там, добавьте к своей команде префикс sudo
. Однако ваш пользователь должен быть членом группы sudoers
.
$ sudo shutdown -P +0
Для проверки концепции попробуйте which shutdown
vs sudo which shutdown
.
Я установил «sudo» в Debian 11. Затем я снова попробовал «выключить -r сейчас», и проблема решилась.