разница между ls -l *.<что-то> | wc -l и ls -l | grep <что-то> | wc -l

IIRC, соединение qemu+ssh://предназначено для удаленного подключения к хосту qemu через SSH и не имеет доступа к SSH внутри ваших гостей.

В выводе, который вы публикуете, вы действительно подключены к qemu через qemu+ssh://с помощью этой команды virsh -c qemu+ssh://hostname@ip/system, а в приглашении virsh #вы будете вводить команды virsh для управления своими гостями, но вам это нужно только для удаленного подключения на ваш хост qemu. Похоже, у вас нет проблем с локальным подключением, поэтому сейчас может быть проще избегать удаленных подключений.

Вы говорите, что хотите подключиться по SSH к каждой виртуальной машине, если на каждой из них работает SSH, то это должно быть так же просто, как войти в SSH каждой виртуальной машины, используя действительные учетные данные. Поскольку у вас уже есть доступ к qemu, как локально, так и удаленно, может быть проще и не требует SSH в гостевой системе использовать virsh consoleдля проверки каждой из ваших виртуальных машин :virsh -c qemu:///system console $VM_NAME. В зависимости от того, как настроены ваши гостевые консоли, вам могут потребоваться учетные данные пользователя для входа в систему.

1
15.01.2020, 15:52
2 ответа

Если вы хотите подсчитать количество не -скрытых файлов с расширением .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 "$#"

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

1
27.01.2020, 23:29

Исходная команда может завершиться ошибкой, если развернутый список файлов окажется слишком длинным, так как расширение списка файлов зависит от оболочки.

ls -l | grep.json | wc -l 

Все в порядке, потому что командная строка короткая (без расширения )и вместо этого grep выполняет фильтрацию построчно.

Обратите внимание, что точка соответствует любому символу, а не только точке. Используйте -F для указания фиксированных строк:

ls -l | grep -F.json | wc -l 

, чтобы случайно не сопоставить файл xjsonили что-то подобное.

Есть еще предостережения для этой команды, а также другие (более надежные )способы достижения желаемой цели, но эти проблемы в стороне, это разница между двумя командами :, фильтрующими по имени файла (т. е. расширение оболочки )по сравнению с трубой -до -grep

1
27.01.2020, 23:29

Теги

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