Поскольку вы не можете привести пример каждого имени файла, которое когда-либо могло существовать, и каждого шаблона, который вы когда-либо могли искать, я продолжу то, что у вас есть:
find. -type f | awk -F / '{print $2}' | grep -v '\.[1-100]$'
Учитывая, что вы указали ver1.txt
, ver1
и file.1
в качестве файлов в каталоге, в котором вы ищете, приведенная выше команда вернет желаемый результат:
ver1.txt
ver1
Объяснить каждую часть:
find. -type f
Возвращает все файлы в текущем каталоге
awk -F / '{print $2}'
Удаляет ./
в начале каждого файла, появляющегося из команды find
grep -v '\.[1-100]$'
Возвращает все файлы, не заканчивающиеся на .#
, где #
— любое число из 1-100
. Переключатель v
находит все строки, не соответствующие .#
. В приведенном вами примере необходимо использовать \
, чтобы экранировать .
, и использовать одинарные кавычки вокруг строки. $
указывает файлы, оканчивающиеся на эту строку, хотя в вашем случае он будет работать и без нее. Я включил его только на тот случай, если могут быть файлы с .
где-то еще в имени файла.
Вам придется изменить параметры в зависимости от того, что вы ищете, но это должно помочь вам начать работу.
Полное раскрытие информации -Я не использую Vagrant, но, сталкиваясь с подобными проблемами PATH в WSL в прошлом, я все еще надеюсь, что это будет решением вашей проблемы.
Во-первых, я предполагаю, что вы используете инструкции WSL для Vagrant. Если да, то у вас установлены две версии Vagrant. Первая — это версия для Windows (, поскольку вы упомянули о ее запуске под PowerShell и cmd ), и, как говорится в документации, «Хотя исполняемый файл vagrant.exe, предоставляемый установкой Vagrant Windows, доступен из WSL, он не будет работать должным образом».
Таким образом, если вы следовали этим инструкциям, вы также установили версию Debian в свой экземпляр WSL через файл.deb.
Но действительно ли WSL использует версию Debian? Скорее всего нет. Поскольку у вас также установлена версия для Windows, и WSL «услужливо» добавляет ваш путь Windows к вашему пути WSL, запуск vagrant up
из WSL/Debian, скорее всего, по-прежнему найдет первый vagrant
на вашем пути, который, вероятно, является Windows версия. На самом деле это очень распространенная проблема с WSL и с установленными версиями инструмента для Windows и Linux.
Вы можете проверить это, запустив which vagrant
из Debian и увидев, какой исполняемый файл найден. Если это версия Windows, то, надеюсь, виновата она.
Есть несколько возможных обходных путей, о которых я знаю:
Создайте сценарий запуска (, например. bashrc или эквивалент для выбранной вами оболочки ), который удаляет узел Windows из пути или, по крайней мере, дает версии Linux более высокий приоритет.
Создайте /etc/wsl.conf с...
[interop]
appendWindowsPath = false
Это приведет к удалению всех путей Windows из сеанса WSL. Недостатком является то, что некоторые полезные утилиты Windows больше не будут находиться в пути WSL, но вы всегда можете добавить их обратно вручную в сценарии запуска. Это, вероятно, проще с точки зрения сценариев, чем удаление путей вручную, по крайней мере.
Если вам это больше не нужно и вы будете использовать исключительно версию для Linux/WSL, вы можете удалить Windows Vagrant.
Убедитесь, что вы используете последнюю версию Vagrant или не ниже 2.2.15, в противном случае исполняемые файлы Windows могут неправильно запускаться из Linux.
Просто добавьте путь к cmd.exe
в Linux:
export PATH="$PATH:/mnt/c/Windows/System32"
В противном случае вы получите следующую ошибку, как вы описали:
The executable 'cmd.exe' Vagrant is trying to run was not
found in the PATH variable. This is an error. Please verify
this software is installed and on the path.
Вы можете добавить приведенную выше строку в свой файл ~/.profile
и перезагрузить его, используя следующие команды:
nano ~/.profile
source ~/.profile
Таким образом, Vagrant сможет найти cmd.exe
.
Через переменную среды VAGRANT_WSL_ENABLE_WINDOWS_ACCESS
Vagrant понимает, что может получить доступ к системе Windows для запуска исполняемых файлов и использования таких функций, как синхронизированные папки. Вы можете найти дополнительную информацию об этой переменной на соответствующей странице официального сайта Vagrant .
export VAGRANT_WSL_ENABLE_WINDOWS_ACCESS="1"
С помощью этой переменной Vagrant будет запускать исполняемые файлы Windows из Linux, включая интерпретатор строк команд Windows cmd.exe
-.
Существует видео на YouTube о том, как установить Vagrant под Ubuntu 18 в WSL1 Windows 10 и VirtualBox . Однако, поскольку это видео демонстрирует использование старого программного обеспечения, более новое программное обеспечение может работать не так, как описано в видео. Кроме того, в видео явно не рассматривается проблема с cmd.exe
, которую вы описали.
В любом случае запуск Vagrant из Linux для создания виртуальной машины в Windows VirtualBox не всегда проходит гладко. Вы можете столкнуться с ошибками, подобными следующим:
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.
Command: ["startvm", "a1d5c124-261b-4e4b-a11a-88f7bfdda6df", "--type", "headless"]
Stderr: VBoxManage.exe: error: Failed to get device handle and/or partition ID for
0000000001cf34e0 (hPartitionDevice=0000000000000a39, Last=0xc0000002/1)
(VERR_NEM_VM_CREATE_FAILED)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole
Чтобы избежать этих ошибок и обеспечить надежную работу Vagrant, вам нужно запускать Linux на физическом оборудовании, а не из контейнера Windows WSL или Docker. Если вы запускаете Linux на физическом оборудовании, VirtualBox также будет работать в Linux, и Vagrant не нужно будет взаимодействовать между Linux и Windows, запуская исполняемые файлы Windows в Linux.