find: ‘count=1’: Нет такого файла или каталога

Информация

/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-информацию, представленную в более прямом виде.

0
20.03.2020, 20:44
2 ответа

Кажется, что вы пытаетесь выполнить каждую команду с помощью -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"
2
28.04.2021, 23:20

Оболочка расширяется 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, чтобы избежать этой проблемы.

5
28.04.2021, 23:20

Теги

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