Использование файла.sh для возврата количества файлов в каталоге

chrootреализовано ядром , отдельно от пространств имен и контрольных групп. Пространства имен монтирования и pivot_rootмогут использоваться для обеспечения той же функциональности, что и chroot; см. Как выполнить chroot с пространствами имен Linux?

Механизм Docker использует chroot.

0
28.04.2020, 15:16
3 ответа

Думаю, проблема в неправильном синтаксисе подстановки команд.

Команда

num=$(( expression ))

интерпретирует содержимое скобок как арифметическое выражение и присваивает числовой результат num. Он , а не вернет результат выполнения того, что написано в скобках в виде кода. Скорее, ls,wcи lбудут интерпретироваться как переменные оболочки, и будет выполнена операция «$lsИЛИ $wcминус $l», результатом которой будет ноль, поскольку ни одна из этих «переменных» не инициализирована.

То, что вы, вероятно, пытаетесь сделать, будет записано как

num="$(ls | wc -l)"

Однако даже в этом случае синтаксический анализ выводаlsв целом не является хорошей идеей. Скорее посмотрите на некоторые ответы на этот аналогичный вопрос , где представлены «надежные» решения, которые также будут работать, когда имена файлов содержат специальные символы.

0
19.03.2021, 02:20

Чтобы найти количество имен в одном каталоге, разверните в нем глобус *и подсчитайте количество сгенерированных слов:

shopt -s nullglob    # to make the * glob expand to nothing
                     # if there is no matching names
set -- *
num=$#

printf '%s\n' "$num"

Специальное значение $#— это количество позиционных параметров. Команда setустанавливает позиционные параметры.

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

shopt -s nullglob dotglob

for name in *; do
    if [ ! -f "$name" ] || [ -L "$name" ]; then
        # skip non-regular files and symbolic links
        continue
    fi
    files+=( "$name" )
done

num=${#files[@]}

printf '%s\n' "$num"

Чтобы сделать это рекурсивно в подкаталогах, также установите параметр оболочки globstarи используйте **/*в качестве шаблона подстановки.

(в оболочке zsh, достаточно было быset -- **/*(.DN); print $#)

Проблема с вашим

num=$(( ls | wc -l ))

двоится:

  1. $((... ))— арифметическое расширение. Вы, вероятно, хотите заменить команду здесь, $(... ).
  2. wc -lне будет считать файлы. Он будет подсчитывать количество символов новой строки, выводимых ls. Файл с одним или несколькими символами новой строки в имени будет считаться несколькими файлами по wc -l. Вы можете проверить это, создав такой файл с помощью touch $'hello\nworld'.
3
19.03.2021, 02:20

Если вы хотите подсчитывать файлы, включая скрытые файлы (.*), но исключая подкаталоги, вы можете использовать:

find. -maxdepth 1 -type f -printf '.' | wc -c

Можно использовать все преимущества find.

2
19.03.2021, 02:20

Теги

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