/proc/cpuinfo
может быть немного запутанной. Это процессоры ядра, которые не обязательно являются физическими процессорами. К ним также относятся ядра/модули и потоки.
Когда вы посмотрите на это:
physical id : 0
siblings : 4
core id : 0
cpu cores : 2
physical id
— фактическое число физического процессора . Он всегда остается равным 0, что означает, что в вашей системе 1 ЦП.
siblings
обозначает, что это один из 4 процессоров ядра(потоков , если хотите ).
core id
можно объяснить как поток на ядро , что означает наличие 2 потоков на каждое ядро , каждый с идентификаторами 0 и 1.
cpu cores
— общее количество ядер , которое имеет этот процессор .
Возможно, было бы проще использоватьlscpu
-информацию, представленную в более прямом виде.
Кажется, что вы пытаетесь выполнить каждую команду с помощью -exec
. В общем случае это не сработает, так как -exec
выполняет только внешние команды.
Вместо этого вызовите скрипт с одной строкой -и пусть find
действует как генератор цикла в этом скрипте:
find rootfs -type f -exec sh -c '
for pathname do
cp -d "$pathname" "/media/$USER" &&
echo. &&
sync
done' sh {} + | wc -l
Это позволит найти все обычные файлы в каталоге rootfs
или ниже. Для пакетов этих файлов вызывается короткий встроенный скрипт sh -c
. Этот сценарий копирует каждый файл в указанный каталог, выводит точку, за которой следует новая строка для каждого успешно скопированного файла, и вызывает sync
.
wc -l
подсчитывает количество выведенных точек и сообщает об этом количестве. Мы не учитываем сами пути, так как этот подсчет может ввести в заблуждение, если какой-либо путь содержит встроенный символ новой строки.
Без использования find
это можно сделать, например,.bash
вот так:
shopt -s globstar dotglob nullglob
for pathname in rootfs/**/*; do
[[ ! -f $pathname ]] && continue
cp -d "$pathname" "/media/$USER" &&
echo. &&
sync
done | wc -l
При этом используется шаблон подстановки, содержащий подстановку **
, которая соответствует внутренним подкаталогам, если установлена опция оболочки globstar
. Я также установил dotglob
, чтобы иметь возможность видеть скрытые имена, и параметр оболочки nullglob
, чтобы вообще не запускать цикл, если шаблон ничему не соответствует.
То же, но со счетчиком:
shopt -s globstar dotglob nullglob
count=0
for pathname in rootfs/**/*; do
[[ ! -f $pathname ]] && continue
cp -d "$pathname" "/media/$USER" &&
count=$(( count + 1 ))
sync
done
printf 'count=%d\n' "$count"
Оболочка расширяется count=$((count+1))
перед запуском find
.
Затем find
попытается выполнить аргумент -exec
как команду. Это должна быть программа или сценарий, это не может быть встроенная оболочка или синтаксис оболочки для назначения переменных.
Подсчет найденных файлов не работает таким образом, потому что find
запускает новый процесс для -exec
, поэтому результат присваивания переменной будет недоступен в родительской оболочке.
Я предлагаю вывести строку для каждого найденного файла и направить вывод find
в wc -l
, например
find rootfs -exec cp -d -- "{}" "/media/$USER/{}" \; -exec sync \; -print|wc -l
Чтобы получить некоторый результат при копировании файлов, вы можете использовать что-то вроде этого:
find rootfs|while IFS= read -r file
do
cp -d -- "$file" "/media/$USER/$file"
sync
count=$((count+1))
echo -en "\rcopiati: $count/$total"
done
Замечания:
Это не работает для имен файлов, содержащих новую строку (и, возможно, другие специальные символы ).
Сценарий может не работать, если rootfs
содержит подкаталоги. Вы должны либо обработать этот случай, либо использовать find
параметры -maxdepth
и -type f
, чтобы избежать этой проблемы.