Да, это возможно, хотя способов больше, чем один.
В зависимости от менеджера виртуальных машин, должна быть опция общего доступа к папке с хоста (Windows в вашем случае) на виртуальную машину (Ubuntu).
Например
В VMware это находится в настройках VM -> вкладка Options -> Shared Folder. Выберите "Всегда включено", затем в разделе "Папки" нажмите кнопку "Добавить".
Это более сложный вариант, поскольку он включает в себя некоторые настройки. Сначала нужно настроить Windows на общий доступ к папке через NFS (отличная статья от Microsoft здесь).
Для справки:
Чтобы открыть общий доступ к папке с помощью Nfsshare.exe:
Войдите на сервер под управлением Windows, используя учетную запись административного уровня.
Нажмите Пуск, выберите Выполнить, введите cmd, а затем нажмите OK.
Введите следующую команду и нажмите ENTER, чтобы открыть общий доступ к папке для клиентов NFS и разрешить анонимный доступ:
nfsshare -o anon=yes share_name=drive:path
Введите следующую команду, а затем нажмите ENTER, чтобы удалить общий ресурс NFS:
nfsshare имя_ресурса /delete
Введите: nfsshare /?, а затем нажмите ENTER, чтобы отобразить параметры, которые вы можете использовать с Nfsshare.
Чтобы открыть общий доступ к папке с помощью проводника Windows:
- Войдите на сервер на базе Windows, используя учетную запись административного уровня.
- Запустите Проводник Windows.
- Щелкните правой кнопкой мыши папку, к которой вы хотите предоставить общий доступ, а затем выберите Общий доступ.
- Перейдите на вкладку NFS Sharing, а затем нажмите Share this folder.
Настройте соответствующие параметры, а затем нажмите OK.
ПРИМЕЧАНИЕ: Microsoft рекомендует установить в сети хотя бы одну службу User Name Mapping для сопоставления имен пользователей UNIX и Windows друг с другом. Пожалуйста, просмотрите статью Kb о службе User Name Mapping ниже.
324073 КАК: Настроить сопоставление имен пользователей
После того, как вы разобрались с этим, вы можете подключить NFS под Ubuntu следующим образом:
sudo mkdir -p /mnt/nfs
/mnt/nfs будет местом на ubuntu, из которого вы сможете получить доступ к папке, но сначала нам нужно указать Ubuntu связать эту папку с NFS, созданной на windows.
Это можно сделать, обратившись к хост-серверу (Windows), который для целей данного руководства имеет IP 192.168.1.10, как показано ниже:
sudo mount 192.168.1.10:/ /mnt/nfs
Надеюсь, это было то, что вы искали.
Не используйте alias
для передачи аргументов. Они не переносимы и полезны только в интерактивных оболочках. Вместо этого используйте функцию и передайте аргументы как необходимые пути
regexFind() {
(( "$#" )) || { printf 'Insufficient arguments provided \n' >&2; return 1; }
find "$1" -regextype egrep -iregex ".*\.(sh|md)$"
}
и вызовите функцию как
regexFind "/home/foo/bar"
Кроме того, чтобы добавить к вашим выводам, обратите внимание, что bash
также имеет встроенный способ для glob-файлов. Вам просто нужно включить пару расширенных опций оболочки, чтобы заставить его работать. -s
включает опцию, а -u
отключает ее.
nullglob
позволяет игнорировать результаты un -расширенного глобуса как действительные совпадения. Итак, если вы хотите сопоставить файлы, оканчивающиеся на *.sh
и *.md
,вам просто нужно перейти в этот конкретный каталог и выполнить
shopt -s nullglob
fileList=(*.sh)
fileList+=(*.md)
shopt -u nullglob
и распечатайте результаты, чтобы увидеть их ниже. Не забудьте указать расширение в кавычках, чтобы имена файлов не подвергались разделению Word -.
printf '%s\n' "${fileList[@]}"
Обратите внимание, что регулярные выражения GNU find
по умолчанию не являются BRE, а emacs REs (своего рода гибрид между BRE и ERE, где, например, +
поддерживается, но вам нужны \(...\)
и |
поддерживается, но как\|
).
В BSD find
по умолчанию используется BRE, и вы можете использовать параметр -E
для включения ERE, так что здесь просто:
alias efind='find -E'
или:
efind() { find -E "$@"; }
В GNU find
включение ERE осуществляется с помощью предиката -regextype posix-extended
, а не параметра. Этот предикат должен стоять после имен файлов, которые, если они есть, должны стоять после опций и перед -regex
или -iregex
, которые их используют.
Синтаксис GNU find
следующий:
find [options] [files] [predicates]
^
Так что вам нужно вставить его туда (в положение, отмеченное^
).
Таким образом, при определении функции-оболочки или сценария необходимо учитывать, что :пропустить все параметры и имена файлов и вставить -regextype posix-extended
сразу после них.
efind() (
found_predicate=false
for arg do
"$found_predicate" || case $arg in
(-[LPDd]|-[OD]*) ;; # skip options
(-*|['()!'])
set -- "$@" -regextype posix-extended
found_predicate=true;;
esac
set -- "$@" "$arg"
shift
done
exec find "$@"
)
Еще пара заметок:
bogus.py
не потому, что использовались BRE, а потому, что вы использовали regex
вместо -regex
. regex
было принято как имя файла, а не предикат. find. | egrep...
недействителен, поскольку пути к файлам могут состоять из более чем одной строки. С инструментами GNU или совместимыми вы можете выполнить find. -print0 | grep -zE...
для работы с записями с разделителями NUL -(и подключиться к tr '\0' '\n'
, если это для отображения. find. -type f \( -name '*.sh' -o -name '*.md' \)
Это будет работать со всеми реализациями find
, поскольку не требует поддержки сопоставления регулярных выражений.
Чтобы сделать это более гибким:
suffixfind () (
dir=$1
shift
for suf do
set -- "$@" -o -name "*.$suf"
shift
done
shift
find "$dir" -type f \( "$@" \)
)
Эта вспомогательная функция оболочки (, которая будет работать в любойsh
-подобной оболочке ), выберет первый аргумент командной строки и поместит его в переменную dir
. Затем он создаст список -name "*.<suf1>" -o -name "*.<suf2>" (etc.)
со всеми суффиксами имен файлов в командной строке функции перед вызовом find
с этим списком для поиска файлов в $dir
или ниже.
Вы бы использовали его как
suffixfind /usr sh md txt
, чтобы найти все обычные файлы с именами, заканчивающимися на .sh
, .md
или .txt
в пути /usr
или под ним.
Несколько более подробный вариант вышеприведенного с использованием bash
массивов и bash
локальных переменных:
suffixfind () {
local dir=$1
shift
local names
names=( -name "*.$1" )
shift
for suf do
names+=( -o -name "*.$suf" )
done
find "$dir" -type f \( "${names[@]}" \)
}
О вашем упоминании инструментов GNU и переносимости :Обратите внимание, что инструменты GNU в системах, отличных от -Linux, иногда доступны, но с префиксом g
к именам инструментов. Таким образом, GNU find
будет доступен как gfind
, чтобы отличить его от собственной реализации find
в системе.
Таким образом, ваш "переносимый GNU" подход должен был бы проверить, доступен ли gfind
, прежде чем проверять, действительно ли find
является GNU find
. Только после того, как вы сделаете это (, возможно, проверив статус возврата и вывод find --version
), вы не сможете быть уверены, что имеете дело с GNU find
.