Как исправить поврежденную файловую систему ext4 _free _inode?

Если вы хотите подсчитать количество не -скрытых файлов с расширением .jsonв текущем каталоге, вы должны сделать:

(){echo $#} *.json(NoN)

(Nдля nullglob, oNдля отключения сортировки, которая здесь нам не нужна ).

ls -l | grep.json | wc -lневерно по ряду причин:

  • .— это оператор регулярного выражения, который соответствует любому одиночному символу. Если вы хотите найти строку .json, это будет grep -F.jsonили grep '\.json'или grep '[.]json'.
  • То Xjsonищется в каждой строке. С помощью ls -lвы печатаете имя файла, имя пользователя, имя группы, цель символических ссылок, все из которых могут содержать Xjson.
  • также имена файлов могут содержать любое значение байта, кроме 0, а/(ссылки могут содержать/); который включает новую строку. Итак, если у вас есть файл с именем xjson\nyjson, который является символической ссылкой на ajson\nbjson, без -q, ls -lдля этого файла будет напечатано 3 строки, каждая из которых будет содержать Xjson. Вы также можете получить сюрпризы, если некоторые имена файлов содержат последовательности байтов, которые не образуют допустимые символы в текущей локали.
  • grep | wc -lобычно можно заменить на grep -c.

ls -l *.json | wc -lеще хуже. Помимо слишком длинного списка аргументов потенциальная проблема , уже отмеченная @L.ScottJohnson, есть также:

  • если нет не -скрытого .jsonфайла, вы получите 0, а также ошибку от zsh, поскольку глобус *.jsonне соответствует.
  • Для каждого из аргументов типа каталог , ls -lперечисляет их содержимое,поэтому, если у вас есть каталог dir.json, все строки, полученные в результате его перечисления, будут подсчитаны. Как правило, вы хотите использовать -dпри передаче расширения глобуса в ls.
  • Если какое-либо из имен файлов .jsonначинается с -, это будет принятоls(в качестве опции, особенно реализациями GNU или busybox ls, которые принимают опции даже после не -аргументов опции ).
  • как и выше, у вас возникнут проблемы, если имя файла или цель символической ссылки содержат символы новой строки.

Большинство из них можно исправить с помощью чего-то вроде:

LC_ALL=C ls -qd -- *.json | wc -l

Но здесь вся работа выполняется оболочкой. Оболочка расширяет *.jsonдо списка соответствующих файлов и передает его в ls. lsиспользуется там только для печати каждого в отдельной строке для передачи в wc, чтобы он мог их подсчитать. lsтакже выполняет много ненужной работы, например выполняет системный вызов stat()для каждого, чтобы проверить его наличие (с -l, он выполняет lstat()и несколько uid/gid для разрешения имени пользователя/группы., и readlink()s для символических ссылок )и снова сортирует список (оболочка уже сортирует расширение *.json).

Оболочка вполне способна подсчитать это расширение сама по себе.

С (){echo $#} *.json(NoN)мы используем анонимную функцию, вы также можете использовать временный массив:files=(*.json(NoN)); echo $#files.

Также обратите внимание, что для построения этого списка нужно только прочитать содержимое текущего каталога, ему не нужно пытаться -искать каждый файл по отдельности, как это делает ls.

Обратите внимание, что этот синтаксис специфичен для zsh. Эквивалентом в POSIX shбудет что-то вроде:

set -- [*].json *.json
case $1$2 in
  ('[*].json*.json') shift 2;;
  (*) shift;;
esac
echo "$#"

(и список файлов находится в"$@"(отсортированном )).

0
18.10.2020, 00:59
0 ответов

Теги

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